objective-c - 如何正确使用 CCSpriteFrameCache 和 CCSpriteBatchNode?

标签 objective-c ipad cocos2d-iphone ccsprite

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

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

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

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

b1)那么,为什么我不能做类似的事情:

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

然后通过调用

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

不将它们添加到批处理节点?因为据我了解它是这样工作的:

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

[spriteSheet addChild:mySprite];

?

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

最佳答案

a) 最好创建尽可能少的 spritesheet (CCSpriteBatchNodes)。 Sprite 批处理减少了绘制调用。绘图调用很昂贵。尽管如此,每个批处理节点都会创建一个绘图调用。所以你想使用尽可能少的,因为最终目标是保持尽可能低的绘制调用。

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

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

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

关于objective-c - 如何正确使用 CCSpriteFrameCache 和 CCSpriteBatchNode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10861550/

相关文章:

ipad - 从应用商店更新应用时,应用的核心数据库是否被删除?

objective-c - 列大小调整完成时 NSTableView 通知?

ios - 如何在表格 View 中调整图像大小?

iphone - 强制文本垂直放置在 UILabel 中?

iphone - 将我的项目从纵向转换为横向时出现问题

iphone:界面更改时搜索栏删除背景

ios - XCode 中的文件夹组织

ios - 围绕屏幕宽度循环字符?

iPhone简单电话号码验证

iphone - 如何在ios中的UIWebView中闪烁文本?