【问题标题】:How do I properly use CCSpriteFrameCache and CCSpriteBatchNode?如何正确使用 CCSpriteFrameCache 和 CCSpriteBatchNode?
【发布时间】:2012-06-02 10:25:42
【问题描述】:

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

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

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

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 以供记忆时,我该如何摆脱它?

【问题讨论】:

标签: objective-c ipad cocos2d-iphone ccsprite


【解决方案1】:

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

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

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

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

【讨论】:

  • 我现在明白了……要完全掌握正在发生的事情总是需要一些时间,但现在我明白了,谢谢。
  • 哇!自从我开始使用 Cocos2d 以来,我刚刚获得了最棒的 AHA 体验。我不敢相信我以前没有得到这个。我最近一直在努力创建一个保持稳定 50-60FPS 的 hex tile 引擎,但我不明白为什么它很慢,即使我只有一种使用 batchnode 的 tile。但是我也犯了一个错误,将精灵放在另一个节点中,并且对屏幕上可见的所有图块不断收到大约 70-80 次绘制调用。一旦我再次使用自己的计算机,我将尝试此操作。谢谢史蒂芬!
  • 那么,我们可以使用的 spritesheets 的数量是否有任何预定义的限制?
【解决方案2】:
  • a) 没有

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

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


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

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2023-04-03
    • 2018-12-04
    相关资源
    最近更新 更多