年末年始でcocos2d-xの勉強の一環でポーカーを作り、一通りの流れは把握しました。
実際の大規模ゲームを開発する上で、データの持ち方を突き詰める必要があると考えました。
##必要な項目
■テクスチャーのAtlas化
■圧縮テクスチャーの使用
■テクスチャーファイルの圧縮
■Cocos Studioに対応
■DLC対応
■分割DLC対応
##テクスチャーのAtlas化
複数の画像を一つのテクスチャーにまとめて扱う「Atlas化」を行いましょう。
Atlasにする理由は以下となります。
・テクスチャーの消費メモリ削減
・描画速度の向上
###テクスチャーの消費メモリ削減
テクスチャーの幅と高さは2の乗数(2,4,8,16,32,64,128,256,512,1024,2048)で持つ必要があります。
2の乗数でないテクスチャーも使えるように見えますが、大半のビデオカードは
2の乗数でないテクスチャーを指定されたときそのサイズが収まる2の乗数のテクスチャーを作成し、コピーを行います。
このコピーコストはかなり高く、これもまたビデオカードにもよりますが2の乗数のテクスチャー転送に比べて
数十倍の作成時間がかかります。
(これはGeForceのビデオカードの測定結果ですので、スマホのビデオカードがどのくらい遅いかはわかりません)
もし、40x40の画像が3枚あった場合、個別のファイルで扱うとビデオカードは
64x64のテクスチャーを3枚作ることになりますが、予め128x64の画像を作り
40x40の画像3枚をその画像の中に収めれば、容量が2/3となるため消費メモリを抑えることができます。
###描画速度の向上
描画コストがかかる理由のひとつにDraw Callというものがあります。
これは描画命令を1回呼ぶ=1Callとなります。
しかし、100個のオブジェクトを表示すると100コールするかといわれるとそうではありません。
OpenGLやDirectXやその他多くのゲーム機には、描画物をまとめて表示する機能があり
こちらを使うことで、描画速度を向上することが可能です。
ただし、まとめて表示するオブジェクトに条件をつける必要があります。
・同一のテクスチャーであること
・同一のレンダリング設定であること
・同一の描画優先度であること(まとめるオブジェクト内では優先度を変更できる)
「同一のレンダリング設定であること」がわかりづらいと思いますが
これはブレンディング設定(アルファ、加算など)やテクスチャーフィルターなどが該当します。
逆にまとめるオブジェクトの中で個別に設定できることは以下となります。
・表示の有無(setVisible)
・座標移動(setPosition)
・拡大縮小(setScale)
・回転(setRotation)
・カラー値(setColor)
・不透明度(setOpacity)
・テクスチャー切り取り座標の変更(setTextureRect)
・まとめるオブジェクトの中の表示優先度(setLocalZOrder)
など
##圧縮テクスチャーの使用
スマホは画面サイズが大きく、またパレット(インデックスカラー)が使えないため
1枚のテクスチャーのサイズが非常に大きくなります。
例えばiPhone5(640x1136)に背景を1枚出そうとすると、テクスチャーのサイズは1024x2048で
更にフルカラーは1ピクセルに4byte(ARGB)消費するので
1024 x 2048 x 4 = 8388608
と、背景1枚表示するのにメモリを8MBも消費してしまいます。
この問題を解決する手法の一つに圧縮テクスチャーがあります。
圧縮テクスチャーは非可逆形式で、アルファありで1/4、アルファなしで1/8のサイズでメモリに乗るため
容量削減に大いに役立ちます。
当然デメリットもあります。
まず、画質が荒くなります。
これは仕様ですので諦めて下さい。
何かを得るためには何かを失うのが世の中です。
次の環境ごとにフォーマットが違います。
これがかなり曲者です。
WindowsではDXT、iOSではPVRTC、AndroidではETC1となります。
各環境ごとに画像を用意しなくてはいけないのも面倒ですが、何よりも問題なのが
AndroidのETC1で、この形式はアルファを扱うことができません。
正確にはAndroidはアルファ付き圧縮テクスチャーを使うことが不可能ではないのですが
使える機種と使えない機種が存在します。
全ての機種で確実に使えるのはこのETC1しか存在しません。
ETC1でアルファを扱う場合、通常の画像とは別にアルファマスクのグレースケール画像を用意し
シェーダを使用して、合成して描画する必要があります。
##テクスチャーファイルの圧縮
上記の圧縮テクスチャーはメモリ展開時のお話でしたが
こちらはストレージに置くときのテクスチャーの圧縮となります。
テクスチャーをgzipで圧縮し、ゲーム内で解凍して使用します。
画像にもよりますが、40~90%くらいの圧縮が見込め、多くのリソースを入れやすくなります。
なお、pngの場合は元々圧縮がかかっているので、ほとんどサイズは変わりません。
##Cocos Studioに対応
UIの配置やアニメーション作成に、Cocos Studioという便利なツールが公式から無料で提供されております。
このツールをデザイナさんに使ってもらって画面を構成し、それをそのまま表示することで開発効率が向上します。
ただし、実機のリソース配置がCocos Studioと同じでなくてはいけないため
Atlas化、圧縮テクスチャー、テクスチャーファイルの圧縮、DLCと組み合わせるためにはテクニックが必要となります。
##DLCの対応
Storeへのアップは~~iPhoneは50MB、Androidは100MB~~(逆でした)iPhoneは100MB、Androidは50MBまでしか許可されていないため
昨今のゲームは起動後にリソースをダウンロードするものが多くなってきています。
開発中にリソースダウンロードを行うのは効率が悪いので、開発中はResourceフォルダにリソースをおいてアクセスし
本番環境ではユーザーキャッシュフォルダにリソースをダウンロードし、アクセスする作りにしなくてはいけません。
##分割DLC対応
必要なデータを必要なときにダウンロードする機能です。
基本的には、サーバからファイルリストを取得してまだ落とし終わっていないファイルが存在したら
ダウンロードを行うというものですが、どのデータがいつ必要であるかを
ヒューマンエラーを出さないように設計するのが大変だと思います。
##最後に
以上のことを踏まえ、今後の開発を進めていきます。
現時点ではAtlas化と圧縮テクスチャーは検証済みとなっていますが
ETCのシェーダ描画を行った際に、DrawCallが増えてしまっているので
こちらをどのように解消するかが、今後の課題です。
検証が済んだものから順次記事にアップしていく予定です。