2

コードのマークされた各行がメモリ消費にどのように影響するかを知りたいです。私のスプライトシートが4MBのメモリを必要とすることを考えると。

CCSpriteBatchNode *spritesBgNode;      // Line 1
spritesBgNode = [CCSpriteBatchNode batchNodeWithFile:@"sprites.pvr.ccz"]; // Line 2
[self addChild:spritesBgNode];    // Line 3
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sprites.plist"]; // Line 4

sprite1 = [CCSprite spriteWithSpriteFrameName:@"sprite1"];  // Line 5
[spritesBgNode addChild:sprite1]; // Line 6 

[spritesBgNode addChild:sprite1]; // Line 7 

[spritesBgNode addChild:sprite1];  // Line 8

[spritesBgNode removeChild:sprite1]; // Line 9

[spritesBgNode removeSpriteFramesFromFile:@"sprites.plist"]; // line 10

[self removeChild: spritesBgNode]; // Line 11

i) 4MB のスプライト シートがメモリを消費し始めるのはどの行ですか?

ii) ライン 5 は余分なメモリ消費につながりますか?

iii) Line 8 (Line 7 を再度追加) の場合はどうなりますか?メモリにどのように影響しますか?

iv) 9 行目と 10 行目はメモリ消費にどのように影響しますか? 彼らはメモリを解放しますか?

v) バッチ ノードがしばらく使用されない場合、11 行目を使用することをお勧めしますか? 後でもう一度追加することの意味は何ですか。

4

1 に答える 1

0

i) スプライトシートは、メモリにロードされるときにメモリを消費します。coco2d はオープンソースのフレームワークなので、コードを確認すると、batchNodeWithFile:呼び出し後にスプライトシートがメモリに追加されていることがわかります。で、このメソッド内のキャッシュに追加します。

ii) 5 行目は単純な自動解放オブジェクトを返します。目的 c では一般的な方法です。オブジェクトは、ティックの終了時にリリース プールによって自動的にリリースされます。たとえば、他のノードに子として追加することによって、オブジェクトを保持しないとオブジェクトが破棄されることを意味します。

iii) お子様を 2 回追加することはできません。追加しようとしているノードの親が ではない場合、アサートが発生しますnil。前に言ったように、CCNode クラスのコードでそれを見ることができます。

iv) テクスチャがメモリにロードされた後、スプライトはテクスチャの一部へのリンクを使用して描画するだけなので、すべてのスプライトは非常に軽量です。したがって、メモリを少し解放しますが、それでも 4MB+ が表示されます。

v) 親からノードを削除した後、オブジェクトが破棄されても、そのテクスチャは引き続きメモリにロードされます。呼び出しでこのテクスチャをアンロードできます

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCTextureCache sharedTextureCache] removeUnusedTextures];

また、いくつかのアニメーションを使用している場合は、それらを CCAnimationCache から削除できます。いずれにせよ、メモリに問題がなければ、メモリからテクスチャをアンロードしないことを提案できます。テクスチャの読み込みは最も時間がかかるプロセスです。そのため、アンロードされたテクスチャからスプライト フレームを描画するまでにラグが発生します。これは、テクスチャが再度読み込まれるためです。

于 2013-07-07T07:54:38.150 に答える