如何正确使用CCSpriteFrameCache和CCSpriteBatchNode?

the*_*tic 8 objective-c cocos2d-iphone ipad ccsprite

当我向我的cocos2d应用程序添加CCSpriteFrameCache或CCSpriteBatchNode时,我不明白我做了什么.有人可以解释以下几点(如果你能解释几个会有所帮助;请根据你回答的问题在你的答案前写下相应的字母):

[所有问题都意味着实现最佳性能和最低内存使用率]

a)为每一层创建spritesheets是否至关重要?(例如:菜单 - 自己的spritesheet,GameLayer - 自己的spritesheet ......)

b)有人可以解释为什么我必须向批处理节点添加精灵,以及批处理节点通常是什么?

b1)那么,为什么我不能做以下事情:

      [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"menusprites.plist"];
       CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"menusprites.png"];
      [self addChild:spriteSheet];
Run Code Online (Sandbox Code Playgroud)

然后通过调用将sprite添加到我的图层

CCSprite *mySprite = [CCSprite  spriteWithSpriteFrameName:@""]; 
[self addChild:mySprite];
Run Code Online (Sandbox Code Playgroud)

没有将它们添加到批处理节点?因为根据我的理解,它的工作原理如下:

我将我的spritesheet与其上的所有精灵添加到屏幕上.我的应用程序然后进入plist并查找我想要显示的精灵的坐标,然后将其放在屏幕上.那我为什么要打电话呢

[spriteSheet addChild:mySprite];
Run Code Online (Sandbox Code Playgroud)

c)当我不再需要它时,如何摆脱spritesheet用于记忆目的?

Lea*_*s2D 14

a)最好尽可能少地创建spritesheets(CCSpriteBatchNodes).Sprite批处理减少了绘制调用.划线电话费用昂贵.仍然,每个批处理节点创建一个绘制调用.因此,您希望尽可能少地使用,因为最终目标是尽可能降低绘制调用.

b)CCSpriteBatchNode在一次批量绘制调用中一次性渲染其所有子节点.这就是为什么你需要将精灵添加到批处理节点,以便它们可以将它们全部渲染在一起.只有与批处理节点使用相同纹理的精灵才能添加到批处理节点,因为您只能从同一纹理批量绘制.每当引擎必须从一个纹理切换到另一个纹理时,它就会发出一个新的绘制调用.

b1)您无法执行此操作,因为批处理节点呈现其子节点.如果将sprite添加到任何其他节点,则每个sprite都会自行绘制,这意味着每个sprite会有一个额外的绘制调用.精灵批处理节点无关.

c)CCSpriteBatchNode只是一个常规节点.您可以像任何其他节点一样将其从场景中删除.纹理和子画面帧缓存在CCTextureCache和CCSpriteFrameCache单例类中.如果要从内存中删除纹理和子画面帧,则必须通过缓存类来完成.