2012-11-12 4 views
6

Ho un CCSpriteBatchNode con una configurazione simile a questo:CCSpriteBatchNode: Child of Child riceve miglioramenti nelle prestazioni di disegno?

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

cui tutti i bambini (ChildA1, ChildB1, ChildA2 ...) sono CCSprite oggetti. Il CCSpriteBatchNode e tutti i bambini, ma ChildA1 viene creato tramite:

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

ChildA1 si crea in questo modo:

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

Nota: Questo rende bene, e vedo l'uscita mi aspetto, dove childB1 's posizione è relativa a childA1 e sposta i risultati childA1 nello spostamento childB1.

La mia domanda è questa: vedrò un guadagno di prestazioni nel disegno ciascuno di childB1 - childB999? Da quanto ho capito, lo CCSpriteBatchNode ottimizza il disegno di tutti i bambini all'interno di uno CCSpriteBatchNode disegnando insieme tutti i suoi figli CCSprites. Questo vale anche per i bambini di quelli CCSprites?

Per coloro che vogliono sapere perché sto facendo questo: Ci sono molti strati all'interno di questo gioco e il raggruppamento CCSprites all'interno di un CCSprite all'interno di un CCSpriteBatchNode mi permette di manipolare un gruppo di CCSprites manipolando solo il genitore di quel gruppo di sprite.

+3

AFAIK, sì. Se stai usando cocos2.0 o superiore, controlla il numero della figura dei disegni, aggiungi alcuni bambini, non dovrebbe aumentare: cioè il nodo del lotto consuma una singola chiamata per trama aggiunta (diversamente da 'per sprite aggiunto'). Non so se stai facendo ARC, ma se non lo sei stai probabilmente perdendo il childA1 come scritto (che il costruttore non restituisce un oggetto autoreleased). – YvesLeBorg

+0

Sono d'accordo con YvesLeBrog .. Se parli di Texture Memory per Cocos2d, è caricato per immagine o texture. Una volta che una trama viene caricata nella memoria, non ci vuole memoria né tempo per caricarla di nuovo, il che si traduce in un miglioramento delle prestazioni del gioco. Per quanto riguarda la memoria consumata dalle tue variabili, non penso che questo sia il modo ideale in quanto le istanze di CCSprite sono autorelease nella sua stessa classe. Quindi non dobbiamo preoccuparci del loro consumo di memoria. –

risposta

2

Risposta breve è, sì, CCSpriteBatchNode effettuerà una chiamata di estrazione per tutti i nodi figlio compresi tutti i discendenti indiretti.

Tuttavia, indipendentemente dal fatto che si usi o meno il normale CCSprites dipende dalla frequenza con cui si modificano gli sprite. Quando si utilizza un CCSpriteBatchNode, ogni volta che si modifica uno sprite, sarà necessario ricalcolare le coordinate quadrate di atlante della trama per quello sprite e tutti i suoi figli che utilizzano la CPU anziché la GPU. Per il tuo esempio, se sposti la posizione di ChildA1, le coordinate per ChildB1 a ChildB999 verranno ricalcolate prima del rendering del fotogramma successivo. Nella maggior parte delle applicazioni, la riduzione dell'estrazione openGL richiama il costo dei calcoli extra, in quanto le chiamate di richiamo sono relativamente costose, ma in ultima analisi dipenderanno dall'applicazione e dal modo in cui utilizza gli sprite, quindi suggerirei di effettuare misurazioni effettive per la tua applicazione se si tratta di un collo di bottiglia delle prestazioni.