2011-09-25 15 views
13

in Cocos2d Suonerò un'animazione. L'animazione ha circa 12 fotogrammi e ogni fotogramma è piuttosto grande. In effetti, la versione -hd di ogni frame è abbastanza grande.Quando utilizzare CCSpriteBatchNode?

In ogni caso, innanzitutto, l'ho creato mettendo tutti e 12 i fotogrammi in una texture utilizzando Zwoptex. La trama è di circa 2048x2048.

Questo è così che posso animare un CCSprite in un CCSpriteBatchNode usando quella texture.

Ma mi sembra di ricevere un avviso di memoria di livello 2.

Ora che ci penso, non penso che CCSpriteBatchNode avrebbe dovuto essere usato per lo sprite uno. Immagino sia stato utile solo se volevi disegnare molti sprite che usassero la stessa texture.

Quindi voglio sapere: Devo animare lo sprite fotogramma per fotogramma (nessuna trama enorme)? O è possibile usare quella texture enorme ma in un modo diverso?

risposta

24

Hai ragione su CCSpriteBatchNode. CCSpriteBatchNode è come un nodo batch: se contiene figli, li disegna in una sola chiamata OpenGL (spesso chiamata "batch draw"), in assenza di CCSpriteBatchNode (in questo caso) verrà chiamato tutto il "batch draw" tante volte quante sono i bambini (sprite).

Un CCSpriteBatchNode può fare riferimento a una sola trama (un file di immagine, un atlante di trama), cioè un foglio di sprite creato da zwoptex. Solo i CCSprite contenuti in tale texture possono essere aggiunti a CCSpriteBatchNode. Tutti i CCSprites aggiunti a un CCSpriteBatchNode sono disegnati in una chiamata draw di OpenGL ES. Se CCSprites non viene aggiunto a un CCSpriteBatchNode, sarà necessaria una chiamata di estrazione OpenGL ES per ciascuno, che è meno efficiente.

Secondo lo scenario, non è necessario utilizzare CCSpriteBatchNode poiché è disponibile una sola trama in un dato momento.

Quindi voglio sapere: Dovrei animare il fotogramma per fotogramma sprite (senza enorme texture)? O è possibile usare quella texture enorme ma in un modo diverso?

Non importa. In ogni caso, caricherete comunque la trama 2048 x 2048. Il problema su cui riflettere è perché solo una trama 2048 x 2048 ti sta dando un avviso di livello 2? quante trame simili stai caricando. BTW 2048 x 2048 è supportato solo su iPod3G/iPhone3GS sopra (che va bene).

Nel caso in cui si stanno caricando molte trame (che mi sembra vero). È necessario programmare alcune regole in cui è possibile scaricare la trama quando non sono necessarie. Non guardare ai seguenti metodi:

[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFramesFromFile:fileName]; 
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]; 
[[CCTextureCache sharedTextureCache] removeUnusedTextures]; 

Per quanto riguarda l'animazione è interessato è possibile creare CCAnimation e l'uso che o (a seconda del vostro scenario) è possibile utilizzare setDisplayFrame (telaio CCSpriteFrame);