2

複数のサブ質問を含む長い質問を前もってお詫びしますが、質問はタイトルに記載されているとおりです。以下は、質問のさまざまな側面の詳細な分割です。

cocos2d を使用して作成した私のユニバーサル ios ゲームには、4 つのカテゴリの画像があります。どれをスプライト シートに入れる必要があり、どれを個別の画像としてロードしたほうがよいかを判断したいと考えています。私の現在の推測では、ゲーム全体で実行されるキャラクター アニメーションのみが、スプライトシートとしてメモリに読み込まれる値を提供します。

  1. ゲーム プレイ全体で実行されるキャラクター アニメーション (ユーザーがメニューにいる場合を除く): これらについては、スプライトシートに画像を配置すると、実行時のメモリ使用量が削減されると想定しています (個々のファイルが 2 バイト境界の累乗​​にパディングされるため)。したがって、それらはスプライトシートの候補です。あれは正しいですか?
  2. 小さな画像 (約 200 個) は、ゲームのプレイ中にランダムに選択され、いつでも 0 ~ 4 個表示されます。これらについては、一度に多くても 4 枚しか使用されない場合に、200 枚の画像すべてをメモリにロードする価値があるかどうかはわかりません。そのため、画像として直接アクセスする方がよい場合があります。あれは正しいですか?
  3. 静的メニューでのみ使用されるボタンのようないくつか (約 20) の小さなメニュー要素: メニュー項目はメニュー表示中にのみ使用されるため、スプライトシートを介したメモリ アクセスの改善にはあまり価値がないと思います。あれは正しいですか?
  4. メニューやゲーム プレイ シーンなどの背景として使用されるいくつかの大きな画像。これらの画像のほとんどは、画面の解像度と同じ大きさです。画面の解像度は 1 つの画像の最大サイズとほぼ同じであるため (たとえば、iPad Retina の場合、4096 x 4096 の画像サイズと 2048 x 1536 の画面サイズ)、スプライトシートを最大で 1または 2 つの大きな画像が 1 つのスプライトシートに収まります。また、これらの大きなファイルはそれぞれ 1 つのシーンでのみ使用されるため、これらすべての大きな画像を事前にメモリにスプライトシートとしてロードすることは、不要なオーバーヘッドのように思えます。したがって、スプライトシートとして直接アクセスしてください。あれは正しいですか?

関連するよくある質問:

a) 異なるシーンで使用される画像を同じスプライトシートにパックすると、そのシーンで画像のサブセットのみが使用されている場合でも、それらをメモリにロードできます。それは悪い考えだと思います。正しい?

b) 古いデバイス (iPad 1 および iPhone 3gs) でのみ、ゲーム プレイにカクつきがあります。スプライトシートはそのような吃音を減らすのに役立ちますか?

c) スプライトシートは実行時のメモリ フットプリントのみにメリットがあり、アプリ アーカイブのディスク上のサイズにはあまりメリットがないと思います。たとえば、サイズが 11.8 MB の一連のファイルをスプライトシートに入れると 11 Mb になることに気付きました。これは、圧縮によるメリットはあまりありません。それは有効な仮定ですか?

上記の私の論理的根拠についてあなたの考えを教えてください。

ありがとう

アナンド

4

1 に答える 1

4

経験則: 適切な理由がない限り、すべてがスプライト シート (テクスチャ アトラス) に入ります。

  1. 間違いなくテクスチャアトラス。

  2. Cocos2d のキャッシュ メカニズムにより、すべての個々の画像がキャッシュされてメモリに残るため、最終的にはテクスチャ アトラスにある場合よりも多くの画像を使用するようになります。めったに必要とされない場合 (メニュー アイコンなど) にのみ単一の画像を使用し、シーンに追加された直後に CCTextureCache から削除して、そのメニュー画面を離れるときにメモリから削除されるようにします。 .

  3. 仮定が間違っている可能性があります。320x480 の画像は、メモリ内のテクスチャとして 512x512 を使用します。それらが複数ある場合は、それらすべてを 1 つのテクスチャ アトラスにまとめたほうがよい場合があります。cocos2d で NPOT サポートを有効にしない限り。繰り返しますが、CCTextureCache がテクスチャをキャッシュしていることを忘れないでください。

  4. 大きなテクスチャは、スプライトバッチから多くの恩恵を受けることに注意してください。したがって、テクスチャ アトラスに 2 ~ 3 個の画像しかない場合でも、パフォーマンスに違いが生じる可能性があります。

a) それは本当に依存します。アプリのメモリが不足している場合は、個別のテクスチャ アトラスが必要になる場合があります。それ以外の場合は、画像を単一のテクスチャ アトラスにパックしないのは無駄です (可能な場合)。

b) 吃音の原因によって異なります。最も一般的な問題: ゲームプレイ中にリソース (画像など) をロードしたり、既存のノードを再利用する代わりにフレームごとに多くのノードを作成および削除したりします。

c) おそらく。テクスチャ アトラス ツールに依存する場合があります (TexturePacker をお勧めします)。それは間違いなくファイル形式に依存します。複数の PNG を 1 つの .pvr.ccz テクスチャ アトラスにパックできれば、多くのメモリを節約できます (そして読み込み速度が向上します)。

詳細については、私のcocos2d メモリ最適化ブログ投稿を参照してください。

于 2013-01-14T20:43:02.503 に答える