8

当我将 CCSpriteFrameCache 或 CCSpriteBatchNode 添加到我的 cocos2d 应用程序时,我不明白我在做什么。有人能解释一下以下几点吗(如果你能解释一些会很有帮助;请根据你回答的问题在你的答案前面写相应的字母):

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

a)为每一层创建精灵表是否至关重要?(例如:Menu - 自己的精灵表,GameLayer - 自己的精灵表...)

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];

?

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

4

2 回答 2

14

a) 最好创建尽可能少的 spritesheets (CCSpriteBatchNodes)。Sprite 批处理减少了绘制调用。绘图调用很昂贵。尽管如此,每个批处理节点都会创建一个绘制调用。因此,您希望尽可能少地使用,因为最终目标是尽可能降低绘制调用。

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

b1)您不能这样做,因为批处理节点呈现其子节点。如果将精灵添加到任何其他节点,每个精灵都会自己绘制,这意味着每个精灵有一个额外的绘制调用。和精灵批处理节点无关。

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

于 2012-06-02T11:19:10.077 回答
2
  • a) 没有

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

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


[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];
于 2012-06-02T11:17:22.997 回答