当我向我的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用于记忆目的,我该如何摆脱它?
答案 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];