2012-11-12 13 views
6

Ich habe eine CCSpriteBatchNode mit einer Konfiguration wie folgt aus:CCSpriteBatchNode: Erhält das Kind des Kindes Zeichenleistungsgewinne?

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

Wo alle Kinder (ChildA1, ChildB1, ChildA2 ...) sind CCSprite Objekte. Die CCSpriteBatchNode und alle Kinder aber ChildA1 über erstellt:

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

ChildA1 wird wie folgt erstellt:

// 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 

Hinweis: Dies macht ganz gut, und ich sehe den Ausgang erwarte ich, wo childB1 ‚s Position ist relativ zu childA1 und bewegt sich childA1 Ergebnisse in childB1 verschieben.

Meine Frage ist dies: Werde ich einen Leistungszuwachs in der Zeichnung von childB1 - childB999 sehen? Von dem, was ich verstehe, optimiert die CCSpriteBatchNode die Zeichnung aller Kinder innerhalb einer CCSpriteBatchNode durch Zeichnen aller seiner Kinder CCSprites zusammen. Gilt das auch für die Kinder dieser CCSprites?

Für diejenigen, die wissen wollen, warum ich das tue: Es gibt viele Ebenen in diesem Spiel und Gruppierungs CCSprites innerhalb eines CCSprite innerhalb eines CCSpriteBatchNode ermöglicht es mir, eine Gruppe von CCSprites durch die Manipulation nur die Eltern davon zu manipulieren Gruppe von Sprites.

+3

AFAIK, ja. Wenn Sie cocos2.0 oder höher verwenden, überprüfen Sie die Anzahl der Zeichnungsfiguren, fügen Sie einige untergeordnete hinzu, es sollte nicht erhöht werden: dh der Stapelknoten verbraucht einen einzelnen Zeichnungsaufruf pro hinzugefügter Textur (im Gegensatz zu "pro hinzugefügtem Sprite"). Ich weiß nicht, ob Sie ARC'ing sind, aber wenn Sie nicht sind, leugnen Sie wahrscheinlich childA1 wie geschrieben (dieser Konstruktor gibt kein automatisches Objekt zurück). – YvesLeBorg

+0

Ich stimme YvesLeBrog zu. Wenn Sie über Textur-Speicher für Cocos2d sprechen, wird es pro Bild oder Textur geladen. Sobald eine Textur in den Speicher geladen wurde, braucht weder Speicher noch Zeit, um sie erneut zu laden, was zu einer Leistungsverbesserung für das Spiel führt. In Bezug auf Speicher, der von Ihren Variablen verbraucht wird, halte ich dies nicht für den idealen Weg, da CCSprite-Instanzen in ihrer Klasse selbst eine Autorelease darstellen. Daher müssen wir uns nicht um ihren Speicherverbrauch kümmern. –

Antwort

2

Kurze Antwort ist, ja, CCSpriteBatchNode wird einen Aufruf für alle untergeordneten Knoten einschließlich aller indirekten Nachkommen zeichnen.

Ob diese Leistung jedoch besser ist als die normale Verwendung CCSprites hängt davon ab, wie oft Sie die Sprites modifizieren. Wenn Sie ein CCSpriteBatchNode verwenden, müssen Sie jedes Mal, wenn Sie ein Sprite ändern, die Texturatlas-Quad-Koordinaten für dieses Sprite und alle seine untergeordneten Elemente neu berechnen, die die CPU anstelle der GPU verwenden. Wenn Sie zum Beispiel die Position ChildA1 verschieben, werden die Koordinaten für ChildB1 bis ChildB999 neu berechnet, bevor das nächste Bild gerendert wird. In den meisten Anwendungen werden die Kosten für die zusätzlichen Berechnungen durch die Reduzierung der OpenGL-Draw-Aufrufe gewichtet, da Aufrufe relativ teuer sind. Letztendlich hängt dies jedoch von Ihrer Anwendung und der Verwendung der Sprites ab Ihre Anwendung, wenn dies ein Leistungsengpass ist.

Verwandte Themen