6

私はCCSpriteBatchNodeこのような構成で持っています:

CCSpriteBatchNode
    ChildA1
        ChildB1
        ChildB2
        ....
        ChildB999
    ChildA2
    ChildA3
    ...

すべての子(ChildA1、ChildB1、ChildA2 ...)がCCSpriteオブジェクトである場合。CCSpriteBatchNodeおよびすべての子ですが、次のChildA1方法で作成されます。

[CCSprite spriteWithSpriteFrameName:@"FileName.png"];

ChildA1このように作成されます:

// Create Parent Sprite
CCSprite* childA1 = [[CCSprite alloc] init];
childA1.contentSize = CGSizeMake(37.5,37.5);
childA1.anchorPoint = ccp(0,0);
[batchNode addChild:childA1 z:0 tag:1];

// Add Child Sprites
[childA1 addChild:childB1 z:0 tag:1];
[childA1 addChild:childB2 z:0 tag:1];
[childA1 addChild:childB3 z:0 tag:1];
// Continue adding childB4-childB999

注:これは問題なくレンダリングされ、期待する出力が表示されます。ここで、childB1の位置は相対的childA1であり、移動すると移動しchildA1ますchildB1

私の質問はこれです:それぞれの図面でパフォーマンスの向上が見られますかchildB1childB999私が理解していることから、すべての子を一緒に描画することにより、CCSpriteBatchNode内のすべての子の描画を最適化します。これはそれらの子供にも当てはまりますか?CCSpriteBatchNodeCCSpritesCCSprites

私がこれを行っている理由を知りたい人のために:このゲーム内には多くのレイヤーがあり、内のグループCCSprites内でグループ化すると、そのスプライトのグループの親のみを操作することでグループを操作できます。CCSpriteCCSpriteBatchNodeCCSprites

4

1 に答える 1

2

簡単な答えは、はい、CCSpriteBatchNodeすべての間接的な子孫を含むすべての子ノードに対して1回の描画呼び出しを行うことです。

ただし、これが通常の使用よりも優れているかどうかはCCSprites、スプライトを変更する頻度によって異なります。を使用するCCSpriteBatchNode場合、スプライトを変更するたびに、GPUではなくCPUを使用して、そのスプライトとそのすべての子のテクスチャアトラスクワッド座標を再計算する必要があります。たとえば、の位置を移動すると、次のフレームがレンダリングされる前にChildA1、の座標ChildB1が再計算されます。ChildB999ほとんどのアプリケーションでは、描画呼び出しは比較的高価であるため、openGL描画呼び出しの削減は、追加の計算のコストを重視しますが、最終的には、アプリケーションとスプライトの使用方法によって異なります。したがって、実際の測定を行うことをお勧めします。これがパフォーマンスのボトルネックである場合は、アプリケーション。

于 2013-02-22T06:02:18.477 に答える