最終形態を考えて設計をする

年末年始でcocos2d-xの勉強の一環でポーカーを作り、一通りの流れは把握しました。
本格的なゲームを1本作ることが目的なので、そのゲームの設計を現在考えております。


DLCの対応
StoreへのアップはiPhoneは50MB、Andoroidは100MBまでしか許可されていないため
昨今のゲームは起動後にリソースをダウンロードするものが多くなってきています。
開発中にリソースダウンロードを行うのは効率が悪いので、開発中はResourceフォルダにアクセスし
本番環境ではユーザーキャッシュフォルダにアクセスする作りにしなくてはいけません。


■整合性チェック
ダウンロードしたリソースが正常であるかどうかを確認し、正常でない場合は再ダウンロードしなくてはいけません。
最初にファイルリストを取得してCRCMD5などを使い、データ整合性を確認する必要があります。


■Atlas化
複数の画像を一つにまとめて扱う「Atlas化」をするべきです。
Atlasにする理由は以下となります。
・テクスチャー容量を少なくする
・描画速度を向上化する


「テクスチャー容量を少なくする」について
テクスチャーの幅と高さは2の乗数(2,4,8,16,32,64,128,256,512,1024,2048)で持つ必要があります。
2の乗数でないテクスチャーも使えるように見えますが、大半のビデオカードは2の乗数でないテクスチャーを指定されたとき
内部でそのサイズが収まる2の乗数のテクスチャーを作成し、コピーを行います。
従って、あらかじめ2の乗数の画像を作成して、その中に複数の画像を納めることで最終的なメモリ消費を削減できます。
また、このコピーコストはかなり高く、これもまたビデオカードにもよりますが2の乗数のテクスチャー転送に比べて数十倍の処理時間がかかりますので
ロード速度の向上にも繋がります。


「描画速度を向上化する」について
描画コストがかかる理由のひとつにDraw Callというものがあります。
これは描画命令が1回呼ぶ=1Callとなります。
しかし、100個のオブジェクトを表示すると100コール必ず呼ばれるかといわれるとそうではありません。
OpenGLDirectXやその他多くのゲーム機には、描画物をまとめて表示する機能があり
こちらを使うことで、描画速度を向上することが可能です。
ただし、描画まとめて行うためにはまとめて表示するオブジェクトに条件をつける必要があります。
・同一のテクスチャーであること
・同一のレンダリング設定であること
・同一の描画優先度であること(まとめるオブジェクト内では優先度を変更できる)


「同一のレンダリング設定であること」がわかりづらいと思いますが
これはブレンディング設定(アルファ、加算など)やテクスチャーフィルターなどが該当します。
逆にまとめるオブジェクトの中で個別に設定できることは以下となります。
・座標移動
・拡大縮小
・回転
・カラー乗算
・アルファ値変更
・テクスチャー切り取り座標の変更


■圧縮テクスチャー
スマホは画面サイズが大きく、またパレット(インデックスカラー)が使えないため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と同じでなくてはいけないため
DLC、圧縮テクスチャー、gzip圧縮と組み合わせるためにはテクニックが必要となってきます。


■今後について
DLCの対応
・整合性チェック
・Atlas化
・圧縮テクスチャー
・画像の圧縮
・Cocos Studioに対応
以上の6点を今後の課題とし、実装方法を突き詰めていきます。
といっても、頭の中ではすでに実装済みとなっており、後は検証を重ねるだけです。


現時点では
・Atlas化
・圧縮テクスチャー
の2つが検証済みとなっていますので、近いうちに記事を書きます。
ただ、圧縮テクスチャーのシェーダ化はDraw Callの数がかさんでしまうので
こちらをどのように回避するかが現在の課題です。

★追伸
今後はQiitaで記事を書いていきます。