如何正确使用CCSpriteFrameCache和CCSpriteBatchNode?

时间:2012-06-02 10:25:43

标签: objective-c ipad cocos2d-iphone 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];

然后通过调用

将sprite添加到我的图层
CCSprite *mySprite = [CCSprite  spriteWithSpriteFrameName:@""]; 
[self addChild:mySprite];

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

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

[spriteSheet addChild:mySprite];

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

2 个答案:

答案 0 :(得分:14)

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

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

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

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

答案 1 :(得分:2)

  • a)否

  • b)batchNode会在你需要同时绘制多个精灵的情况下提高你的性能,如果有少量的精灵(10,20等)我不认为你会注意到任何性能提升。 batchNode要快得多,因为opengl应该只绘制它以查看所有内容。在其他情况下,opengl将分别绘制所有对象。也就是说 - 如果你有500,600,700个精灵,将为每个精灵调用draw()visit()方法。如果它们都将被放置到batchNode,则只有一个draw()来电和一个visit()来电

  • c)您可以手动清除缓存数据,通过调用这些方法来强制释放内存:


[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];