何时使用CCSpriteBatchNode?

13

在Cocos2d中,我将播放一段动画。该动画有大约12帧,每一帧都相当大。实际上,每一帧的高清版本相当巨大。

无论如何,首先,我是通过使用Zwoptex将所有12帧放在一个纹理中创建它的。该纹理大约为2048x2048。

这样我就可以使用该纹理在CCSpriteBatchNode中动画播放CCSprite了。

但是我似乎收到了二级内存警告。

现在我想起来,我认为CCSpriteBatchNode不应该用于一个 sprite。我猜它只有在您想绘制使用同一纹理的大量sprite时才有用。

所以我想知道:我应该逐帧播放精灵(没有巨大的纹理)吗?还是可以以不同的方式使用那个巨大的纹理?

1个回答

24
你对CCSpriteBatchNode的理解是正确的。 CCSpriteBatchNode类似于一个批处理节点:如果它包含子元素,它会在1次OpenGL调用中将它们绘制出来(通常称为“批处理绘制”),如果没有CCSpriteBatchNode(在这种情况下),所有的“批处理绘制”将被调用与子元素(精灵)数量一样多。
CCSpriteBatchNode只能引用一个纹理(一个图像文件、一个纹理集),即由zwoptex创建的精灵表。只有包含在该纹理中的CCSprites才能添加到CCSpriteBatchNode中。添加到CCSpriteBatchNode中的所有CCSprites都在一个OpenGL ES绘制调用中绘制。如果CCSprites未添加到CCSpriteBatchNode,则需要为每个CCSprite进行一个OpenGL ES绘制调用,这样效率就不高。
根据你的情况,由于任何时候只渲染一个纹理,因此不必使用CCSpriteBatchNode。
所以我想知道:我应该逐帧动画精灵表(没有庞大的纹理)吗?或者能否以不同的方式使用那个庞大的纹理?
无论如何你都会加载2048 x 2048的纹理。需要考虑的问题是为什么只有一个2048 x 2048的纹理给你一个二级警告?你加载了多少这样的纹理?另外,2048 x 2048仅受iPod3G/iPhone3GS及以上支持(这很好)。
如果你正在加载许多纹理(我认为是真的),你需要编写一些逻辑来在不需要时卸载纹理。请看以下方法:
[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFramesFromFile:fileName];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCTextureCache sharedTextureCache] removeUnusedTextures];

就动画而言,你可以创建CCAnimation并使用它,或者(根据你的情况)可以使用setDisplayFrame(CCSpriteFrame frame)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接