何时使用CCSpriteBatchNode?

时间:2011-09-25 23:15:02

标签: objective-c cocos2d-iphone

在Cocos2d中我将播放动画。动画大约有12帧,每帧都相当大。事实上,每帧的-hd版本都非常庞大。

无论如何,首先,我通过使用Zwoptex将所有12帧放入纹理中来创建它。纹理大约是2048x2048。

这样我就可以使用该纹理在CCSpriteBatchNode中设置CCSprite的动画。

但我似乎得到了2级记忆警告。

现在我想到了,我不认为CCSpriteBatchNode应该用于一个精灵。我想这只是想要绘制大量使用相同纹理的精灵才有用。

所以我想知道:我应该逐帧动画精灵(没有巨大的纹理)吗?或者是否可以以不同的方式使用那种巨大的纹理?

1 个答案:

答案 0 :(得分:24)

你对CCSpriteBatchNode是正确的。 CCSpriteBatchNode就像一个批处理节点:如果它包含子节点,它将在单个OpenGL调用中绘制它们(通常称为“批量绘制”),如果没有CCSpriteBatchNode(在这种情况下),所有“批量绘制”将被调用为很多时候,孩子的数量(精灵)。

CCSpriteBatchNode可以引用一个且仅一个纹理(一个图像文件,一个纹理图集),即zwoptex创建的sprite表。只有该纹理中包含的CCSprit可以添加到CCSpriteBatchNode中。添加到CCSpriteBatchNode的所有CCSprit都在一个OpenGL ES绘制调用中绘制。如果未将CCSprit添加到CCSpriteBatchNode,则每个CCSprit都需要进行OpenGL ES绘制调用,效率较低。

根据您的方案,您不必使用CCSpriteBatchNode,因为在任何给定时间只渲染一个纹理。

  

所以我想知道:我应该逐帧动画精灵(没有巨大的纹理)吗?或者是否可以以不同的方式使用那种巨大的纹理?

没关系。无论如何,你将加载2048 x 2048纹理。要思考的问题是为什么只有一个2048 x 2048纹理会给你2级警告?你加载了多少这样的纹理。 BTW 2048 x 2048仅支持iPod3G / iPhone3GS以上(很好)。

如果您要加载许多纹理(这对我来说似乎是真的)。您需要编写一些逻辑,您可以在不需要时卸载纹理。 请查看以下方法:

[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFramesFromFile:fileName];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCTextureCache sharedTextureCache] removeUnusedTextures];

就动画而言,你可以创建CCAnimation并使用它或(根据你的场景)你可以使用setDisplayFrame(CCSpriteFrame frame);