1

メモリ フットプリントを削減するために、マルチスレッドを使用してオンザフライで追加のテクスチャをロードする必要性に直面しました。

例のケースでは、1 つのレベルで使用する敵が 10 種類ありますが、敵は種類ごとに出てきます。「タイプごと」のコンテキストは、あるタイプの敵が出てきて、プレイヤーがそのすべてのインスタンスを倒した後、別のタイプを呼び出す時が来たことを意味します。こんな感じで全種類出てくるとレベルクリアです。

開始時に最初にすべての敵のテクスチャを一度に読み込まない方が良いことがわかります (かなり大きい 2048*2048 で、その中にたくさんのアニメーション フレームがあり、敵の種類ごとに作成する必要があります)。これをマルチスレッドにして、必要なときに追加のテクスチャをロードします。しかし、cocos2d-x がスレッドセーフではないことはわかっていました。CCSpriteFrameCache クラスを使用して .plist + .png ファイルからテクスチャを読み込み、そこでアニメーションを再作成し、最後にそこから CCSprite を作成して新しいタイプの敵インスタンスを表すことを計画しました。マルチスレッドを使用しないと、大きなサイズのテクスチャをロードする際に発生するラグの遅延が発生する可能性があります。

では、上記の目標に従って、cocos2d-x の別のスレッドにテクスチャをロードするにはどうすればよいでしょうか? スレッドセーフの問題を回避しながら、それでも私の目標を達成できるアイデアも高く評価されます。

注: 私は iOS プラットフォームで開発しています。

4

1 に答える 1

3

画像の非同期読み込みはすでにcocos2d-x内にあることがわかりました。cocos2d-xのテストプロジェクトをビルドして「Texture2DTest」を調べ、左矢印をタップして非同期読み込みがどのように見えるかを確認できます。

コードの内部を調べました。addImageAsyncのメソッドを使用CCtextureCacheして、実行中の現在のアニメーションなどの他の部分に干渉したり、速度を落としたりすることなく、追加のテクスチャをオンザフライでロードできます。実際、addImageAsyncofはオブジェクトをCCTextureCacheロードCCTexture2Dし、そのコールバックメソッドに戻って受信します。あなたはあなたに代わってそれを利用するための追加のタスクがあります。

フレームのロードにCCSpriteFrameCache使用することに注意してください。CCTextureCacheしたがって、これは、アニメーションの作成に使用されるフレームで構成されるスプライトシートをロードする場合にも当てはまります。しかし残念ながら、非同期タイプのメソッドはCCSpriteFrameCacheクラスに提供されていません。テクスチャオブジェクトを手動でロードしてからCCTextureCacheプラグインする必要があります

void CCSpriteFrameCache::addSpriteFramesWithFile(const char *pszPlist, CCTexture2D *pobTexture)

テストプロジェクトには2つのファイルがあります。

  • Texture2dTest.cpp
  • TextureCacheTest.cpp
于 2012-11-06T11:05:50.607 に答える