如何正确地使用CCSpriteFrameCache和CCSpriteBatchNode?

8

我不太清楚在我的cocos2d应用程序中添加CCSpriteFrameCache或CCSpriteBatchNode时具体做了什么。有人能解释以下几点吗(如果你能解释几个就很有帮助,请在回答问题的字母前写上对应的字母):

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

a)每个图层都创建精灵表是至关重要的吗? (例如:菜单-自己的精灵表,游戏层-自己的精灵表...)

b)有人能解释一下为什么我必须将精灵添加到批处理节点中,以及批处理节点通常是什么?

b1)那么,为什么我不能只做这样的事情:

      [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"menusprites.plist"];
       CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"menusprites.png"];
      [self addChild:spriteSheet];

然后,您只需调用该层以添加精灵即可。

CCSprite *mySprite = [CCSprite  spriteWithSpriteFrameName:@""]; 
[self addChild:mySprite];

不将它们添加到批处理节点中,是否可行?因为我理解的是它是这样工作的:
我将带有所有精灵的精灵表添加到屏幕上。然后,我的应用程序进入plist并查找要显示的精灵的坐标,然后将其放置在屏幕上。那么为什么要调用呢?
[spriteSheet addChild:mySprite];

怎么样才能在不需要精灵图时为了节省内存而将其删除呢?


这是一篇由 Code and Web 提供的非常不错的三部分解释 - 游戏精灵表。Game Sprites Movie - uchamp
2个回答

14

a) 尽可能少地创建精灵表(CCSpriteBatchNodes)是最佳选择。精灵批处理可以减少绘制调用,而绘制调用是昂贵的。但是每个批处理节点都会创建一个绘制调用。因此,您需要尽可能少地使用它们,因为终极目标是保持绘制调用尽可能低。

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

b1) 你不能这样做,因为批处理节点渲染其子节点。如果将精灵添加到任何其他节点,则每个精灵将自己绘制,这意味着每个精灵会增加一个绘制调用。而精灵批处理节点没有任何作用。

c) CCSpriteBatchNode只是一个常规节点。您可以像删除其他节点一样将其从场景中移除。纹理和精灵帧被缓存在CCTextureCache和CCSpriteFrameCache单例类中。如果您想从内存中删除纹理和精灵帧,则必须通过缓存类来执行。


我现在明白了...要完全理解发生的事情总是需要一些时间,但现在我明白了,谢谢。 - the_critic
1
哇!自从我开始使用Cocos2d以来,我刚刚获得了最棒的AHA体验。我简直不敢相信我之前没有想到这个。最近我一直在努力创建一个六边形瓦片引擎,以保持稳定的50-60FPS,但我无法理解为什么它会变慢,即使我只有一种使用batchnode的瓦片类型。但我犯了一个错误,把精灵放在另一个节点中,所有可见的瓦片都需要70-80次绘制调用。我一旦再次拿到自己的电脑就会尝试这个方法。谢谢Steffen! - bobmoff
那么,我们可以使用预定义的精灵表数量限制吗? - Renaissance

2
  • a) 不

  • b) 当你需要同时绘制许多精灵时,batchNode可以提高你的性能,在小数量的精灵(10, 20等)的情况下,我认为你不会注意到任何性能提高。batchNode更快,因为OpenGL只需绘制它以查看所有内容。在其他情况下,OpenGL将单独绘制所有对象。也就是说,如果你有500、600、700个精灵,draw()visit()方法将为每个精灵调用一次。如果它们都放置在batchNode中,将只有一个draw()调用和一个visit()调用

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接