objective c - ¿Cómo uso correctamente CCSpriteFrameCache y CCSpriteBatchNode?
objective-c ipad (2)
No entiendo lo que hago exactamente cuando agrego un CCSpriteFrameCache o CCSpriteBatchNode a mi aplicación cocos2d. ¿Puede alguien explicar los siguientes puntos (sería útil si pudiera explicar algunos, por favor escriba la letra correspondiente delante de su respuesta de acuerdo con la pregunta que está respondiendo):
[todas las preguntas implican el logro del mejor rendimiento y el menor uso de memoria]
a) ¿Es crucial crear hojas de sprites para cada capa? (Por ejemplo: Menú - propia hoja de sprites, GameLayer - propia hoja de sprites ...)
b) ¿Alguien puede explicar por qué tengo que agregar sprites al nodo de proceso por lotes, y qué nodo de lote por lo general es?
b1) Entonces, ¿por qué no puedo hacer algo como esto?
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"menusprites.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"menusprites.png"];
[self addChild:spriteSheet];
Y luego simplemente agregue sprites a mi capa llamando
CCSprite *mySprite = [CCSprite spriteWithSpriteFrameName:@""];
[self addChild:mySprite];
sin agregarlos al nodo de proceso por lotes? Porque por lo que entiendo funciona así:
Agrego mi hoja de sprites con todos los sprites a la pantalla. Mi aplicación luego entra en el plist y busca las coordenadas del sprite que quiero mostrar y luego las coloca en la pantalla. Entonces, ¿por qué debería llamar
[spriteSheet addChild:mySprite];
?
c) ¿Cómo me deshago de la hoja de sprites para fines de memoria cuando ya no la necesito?
a) Lo mejor es crear el menor número posible de hojas de sprites (CCSpriteBatchNodes). Sprite batching reduce las llamadas al sorteo. Las llamadas al sorteo son costosas. Aún así, cada nodo de proceso por lotes crea una llamada de dibujo. Por lo tanto, debe utilizar el menor número posible porque el objetivo final es mantener las llamadas al mínimo posible.
b) CCSpriteBatchNode representa todos sus elementos secundarios de una vez, en una llamada de sorteo por lotes. Es por eso que necesita agregar sprites al nodo de procesamiento por lotes para que pueda procesarlos todos juntos. Solo los sprites que usan la misma textura que el nodo batch se pueden agregar a un nodo batch, ya que solo se puede dibujar por lotes desde la misma textura. Cuando el motor tiene que cambiar de una textura a otra, emite una nueva llamada de extracción.
b1) No puede hacer esto porque el nodo de proceso por lotes representa sus elementos secundarios. Si agrega los sprites a cualquier otro nodo, cada sprite se dibujará a sí mismo, lo que significa una llamada de sorteo adicional por sprite. Y el nodo sprite batch no tiene nada que hacer.
c) CCSpriteBatchNode es solo un nodo regular. Puedes eliminarlo de la escena como cualquier otro nodo. Los marcos de textura y sprite se almacenan en caché en las clases singlete CCTextureCache y CCSpriteFrameCache. Si desea eliminar las texturas y los cuadros de sprites de la memoria, debe hacerlo a través de las clases de caché.
a) no
b) batchNode aumenta tu rendimiento cuando necesitas dibujar muchos sprites al mismo tiempo, en el caso de un número pequeño de sprites (10, 20. etc.), no creo que notarás un aumento de rendimiento. batchNode es mucho más rápido porque opengl debería dibujar solo para ver todo el contenido. en otro caso, OpenGL dibujará todos sus objetos por separado. es decir, si tendrá 500, 600, 700 sprites, se llamarán los métodos
draw()
yvisit()
para cada uno. si se colocarán todos en el batchNode, será solo una llamadadraw()
y una llamadavisit()
c) puede purgar datos en caché manualmente para forzar la liberación de memoria llamando a estos métodos:
[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];