バックグラウンドスレッドでAtlasSpriteManagerをロードしても機能しない

StackOverflow https://stackoverflow.com/questions/1632445

  •  06-07-2019
  •  | 
  •  

質問

私はcocos2dを使用して、巨大なキャラクターアニメーションのセット(少なくとも25種類)を含むiPhoneゲームをやっています。そのために、それぞれが約100KBから200KBのスプライトシートをたくさん持っています。これらのオンデマンドのAtlasSpriteManagers。しかし、デバイスでこれをテストしたとき、これらのアニメーションの周囲には多くのパフォーマンスの問題がありました。フレームが欠落していました。

だから、事前ロードとキャッシングのテクニックを作成し、常に必要なAtlasSpriteManagerを作成して、NSMutableDictionaryでそれらを維持し、アニメーション中にそこから取得することにしました。変数、後でこの辞書からそれらを削除し、メモリを解放します。そして、performSelectorInBackgroundメソッドを使用してこの関数「loadASM」を呼び出し、AtlasSpriteManagerを作成して辞書に保存します。

[self performSelectorInBackground:@selector(loadASM:) withObject:fileName];

-(ASMHolder *)loadASM:(NSString *)fileName
{
AtlasSpriteManager *sprMgr = [AtlasSpriteManager spriteManagerWithFile:fileName capacity:40];
ASMHolder *asmHolder = [[ASMHolder alloc] init];
asmHolder.sprMgr = sprMgr; asmHolder.retainCount++;
[asmDict setObject:asmHolder forKey:fileName];

return asmHolder;
}

ただし、performSelectorInBackgroundを使用してバックグラウンドでこのメソッドを呼び出した場合、画像はロードされないようです。画像が表示されるはずの場所に白い色のボックスが表示されます。しかし、AtlasSpriteManagerオブジェクトが作成され、辞書にあります..しかし、それは単に空白のスプライトになります。そして、バックグラウンド呼び出しの代わりに、メソッド 'loadASM'を直接呼び出そうとすると(つまり[self loadASM:fileName])、画像はロードされます。これは同期呼び出しなので遅延があります。

AtlasSpriteManagersの代わりにTexture2Dオブジェクトもキャッシュしようとしましたが、結果は同じです。.

(TextureManagerのaddImageAsyncも試してみました..しかし、それは私の目的にも役立ちません..ファイル名がコールバックメソッドの引数に読み込まれていないため、辞書キャッシュのキーを作成できません。 )

助けてください。

ありがとう サンカル

役に立ちましたか?

解決

複数のスレッドからOpenGLを使用するには、特別なことをする必要があります。 この質問をご覧ください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top