2011-09-25 37 views
13

在Cocos2d我将播放动画。动画大约有12帧,每帧都比较大。实际上,每个帧的-hd版本是相当巨大的。何时使用CCSpriteBatchNode?

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

这样我就可以使用该纹理在CCSpriteBatchNode中创建CCSprite动画。

但我似乎得到了2级内存警告。

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

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

回答

24

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

CCSpriteBatchNode可以引用一个且只有一个纹理(一个图像文件,一个纹理图集),即由zwoptex创建的精灵图纸。只有包含在该纹理中的CCSprites可以添加到CCSpriteBatchNode中。所有添加到CCSpriteBatchNode的CCSprites都在一个OpenGL ES绘图调用中绘制。如果CCSprites没有添加到CCSpriteBatchNode中,那么每个CCSprites都需要一个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帧);