バックグラウンドスレッドでAtlasSpriteManagerをロードしても機能しない
-
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を使用するには、特別なことをする必要があります。 この質問をご覧ください。