2

シングルトンインスタンスではないGameSceneクラスを取得しました。したがって、ユーザーが新しいレベルを選択するたびに割り当てと割り当て解除を行い、「静的」/「共有」データを別のシングルトンクラス(GameManagerなど)に保持します。

ARCを使用しています。私のアプローチがメモリ管理の観点から正しいかどうかを理解したいと思います。つまり、クリーンアップ時に「removeUnusedSpriteFrames」を呼び出すだけで十分ですか?これにより、game-art-forLevelOne-hd.plist内のすべてのスプライトが削除されますか?CCSpriteBatchNodeでも何かを行う必要がありますか?

-(void) loadGameArtFileForLevelOne  //I do this in a switch but this is to simplify the reading 
{
    CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
    [frameCache addSpriteFramesWithFile:@"game-art-forLevelOne-hd.plist"];
    CCSpriteBatchNode * sharedSpriteBatchNode = [CCSpriteBatchNode batchNodeWithFile:@"game-art-forLevelOne-hd.png"];    
 }

//As dealloc is deprecated for ARC code, I prefer to remove unused sprites and texture on cleanup
-(void) cleanup
{
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];     
}

CCSpriteBatchノードのdeallocメソッドにCCLOG呼び出しを追加しました。GameSceneをロードしてメニューに戻ると、期待どおりに「未使用のテクスチャを削除」のログが表示されますが、CCSpriteFrameCacheのdeallocメソッドのログは表示されません。* !! 警告:以下の編集を参照してください-私の間違い!! *

編集:申し訳ありませんが、CCSpriteBatchのdeallocメソッドのログが表示されないことを意味しました

レベルのスプライトに関連するすべてのメモリを「解放」して削除したいので、これは少し心配です。

これを理解したら、このビットを「最適化」します(たとえば、レベルのクラスごとに1つのスプライトシート(たとえば、ワールド1)と、背景ごとに1つのスプライトシートを用意します)。

なにか提案を?

4

2 に答える 2

4

これを使用できます。

 [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];

さらに必要な場合は、followを使用してください。

[[CCDirector sharedDirector] purgeCachedData];
[[CCTextureCache sharedTextureCache] removeAllTextures];
[CCTextureCache purgeSharedTextureCache];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
于 2012-09-17T09:39:13.610 に答える
1

編集:

CCSpriteBatchNode投稿したコードにはノードが表示されていませんが、どこかにノードを追加していると思います(また、スイッチで発生するため、まったく異なる設定であると思います)。その場合、追加した場所から削除するまで、割り当てが解除されません。

ここでは、おそらく、説明が必要です。

これCCSpriteFrameCacheはキャッシュです。すべてのスプライトがすぐに再利用できるようにするためのストレージです。

これCCSpriteBatchNodeは、原則としてキャッシュとはまったく関係のないOpenGLレイヤーのパフォーマンスを向上させるためのメカニズムです。

バッチノードで使用されているスプライトがレイヤー/ノード/シーンにまだ存在している場合、それは「未使用」とは見なされず、クリーンアップコードによって削除されないことを理解しています。実は使用中です。キャッシュされたスプライトは、それを参照するすべてのノードから削除すると「未使用」になります。

あなたの質問に関して:

つまり、クリーンアップ時に「removeUnusedSpriteFrames」を呼び出すだけで十分ですか?

まあ、それはあなたのアプリに依存していると思います。キャッシュから未使用のスプライトを削除することは確かに問題ありません。ただし、他のことも行う場合があります。ロードしたオーディオリソースをアンロードします。使用されていないシーンの部分を削除します(必要に応じてリロードできます)。等

お役に立てれば。

CCSpriteFrameCacheのdeallocメソッドのログが表示されません。

CCSpriteFrameCacheはシングルトンであるため、プログラムの存続期間中存在する必要があります(異なる可能性がありますが、これが当てはまると思います)。

 CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];

したがって、キャッシュが削除されないという事実については心配しません。重要なのは、そのコンテンツが空になっていることです。

于 2012-09-17T09:02:57.773 に答える