8

CCSpriteFrameCacheまたはCCSpriteBatchNodeをcocos2dアプリケーションに追加したときに何をするのか正確にはわかりません。誰かが次の点を説明してもらえますか(いくつか説明していただければ助かります。回答の前に、回答している質問に応じて対応する文字を書いてください)。

[すべての質問は、最高のパフォーマンスと最低のメモリ使用量の達成を意味します]

a)すべての単一レイヤーにスプライトシートを作成することは重要ですか?(例:メニュー-独自のスプライトシート、GameLayer-独自のスプライトシート...)

b)誰かが私がバッチノードにスプライトを追加しなければならない理由と、バッチノードが一般的に何であるかを説明できますか?

b1)それで、なぜ私は次のようなことをすることができないのですか?

      [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"menusprites.plist"];
       CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"menusprites.png"];
      [self addChild:spriteSheet];

次に、を呼び出してスプライトをレイヤーに追加します

CCSprite *mySprite = [CCSprite  spriteWithSpriteFrameName:@""]; 
[self addChild:mySprite];

それらをバッチノードに追加せずに?私が理解していることから、それはこのように機能するからです:

すべてのスプライトを含むスプライトシートを画面に追加します。次に、アプリがplistに入り、表示したいスプライトの座標を探して、画面に配置します。だからなぜ私は電話する必要があります

[spriteSheet addChild:mySprite];

c)スプライトシートが不要になったときに、メモリの目的でスプライトシートを削除するにはどうすればよいですか?

4

2 に答える 2

14

a)できるだけ少ないスプライトシート(CCSpriteBatchNodes)を作成するのが最善です。スプライトバッチ処理により、描画呼び出しが減少します。ドローコールは高額です。それでも、すべてのバッチノードは1つの描画呼び出しを作成します。したがって、最終的な目標はドローコールを可能な限り低く保つことであるため、使用する量をできるだけ少なくする必要があります。

b)CCSpriteBatchNodeは、1回のバッチ描画呼び出しで、すべての子を一度にレンダリングします。そのため、バッチノードにスプライトを追加して、それらをすべて一緒にレンダリングできるようにする必要があります。バッチノードに追加できるのは、バッチノードと同じテクスチャを使用するスプライトのみです。これは、同じテクスチャからのみバッチ描画できるためです。エンジンがあるテクスチャから別のテクスチャに切り替える必要があるときはいつでも、新しい描画呼び出しを発行します。

b1)バッチノードはその子をレンダリングするため、これを行うことはできません。スプライトを他のノードに追加すると、各スプライトはそれ自体を描画します。つまり、スプライトごとに1つの追加の描画呼び出しが行われます。そして、スプライトバッチノードは何の関係もありません。

c)CCSpriteBatchNodeは単なる通常のノードです。他のノードと同じようにシーンから削除できます。テクスチャフレームとスプライトフレームは、CCTextureCacheおよびCCSpriteFrameCacheシングルトンクラスにキャッシュされます。テクスチャとスプライトフレームをメモリから削除する場合は、キャッシュクラスを介して削除する必要があります。

于 2012-06-02T11:19:10.077 に答える
2
  • a)いいえ

  • b)batchNodeは、同時に多数のスプライトを描画する必要がある場合にパフォーマンスを向上させます。スプライトの数が少ない場合(10、20など)、パフォーマンスの向上に気付くとは思いません。openglはすべてのコンテンツを表示するためにそれだけを描画する必要があるため、batchNodeははるかに高速です。それ以外の場合、openglはすべてのオブジェクトを個別に描画します。つまり、500、600、700のスプライトがある場合は、それぞれに対してメソッドdraw()visit()メソッドが呼び出されます。それらがすべてbatchNodeに配置される場合、それは1回のdraw()呼び出しと1回のvisit()呼び出しのみになります

  • c)次のメソッドを呼び出すことにより、キャッシュされたデータを手動でパージして、メモリを強制的に解放できます。


[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];
于 2012-06-02T11:17:22.997 に答える