当我将CCSpriteFrameCache或CCSpriteBatchNode添加到CCSpriteBatchNode应用程序时,我不明白我到底要做什么。有谁能解释一下以下几点(如果你能解释几点,请在你回答的问题前面写一封相应的信):
所有问题都意味着获得最佳的性能和最低的内存使用。
a)为每一层创建spritesheets是至关重要的吗?(例如:菜单自己的spritesheet,GameLayer自己的spritesheet.)
b)有人能解释为什么我要在批处理节点中添加精灵,以及批处理节点通常是什么?。
(b1)那么,为什么我不能做这样的事情:
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"menusprites.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"menusprites.png"];
[self addChild:spriteSheet];然后通过调用
CCSprite *mySprite = [CCSprite spriteWithSpriteFrameName:@""];
[self addChild:mySprite];而不将它们添加到批处理节点?因为据我所知,它是这样工作的:
我将带有所有精灵的spritesheet添加到屏幕上。然后,我的应用程序进入plist,查找我想要显示的sprite的坐标,然后将它放在屏幕上。那我为什么要打电话
[spriteSheet addChild:mySprite];c)当我不再需要它时,如何为了内存的目的而去掉它呢?
发布于 2012-06-02 11:19:10
( a)最好尽可能少创建spritesheets (CCSpriteBatchNodes)。雪碧批处理减少了抽签呼叫。抽奖电话太贵了。不过,每个批处理节点都会创建一个抽签调用。因此,您希望使用尽可能少,因为最终目标是保持尽可能低的抽签调用。
( b) CCSpriteBatchNode在一次抽签中一次将所有的子调用都呈现出来。这就是为什么您需要向批处理节点添加sprites,这样它就可以将它们全部呈现在一起。只有使用与批处理节点相同的纹理的精灵才能添加到批处理节点,因为您只能从同一纹理进行批处理绘制。每当引擎不得不从一种纹理切换到另一种纹理时,它就发出一个新的抽签调用。
b1)您不能这样做,因为批处理节点呈现它的子节点。如果将精灵添加到任何其他节点,那么每个sprite都会自己绘制,这意味着每个sprite会增加一个抽签调用。而且sprite批处理节点没有什么可做的。
c) CCSpriteBatchNode只是一个普通的节点。您可以像其他节点一样将其从场景中移除。纹理和精灵帧缓存在CCTextureCache和CCSpriteFrameCache单例类中。如果要从内存中删除纹理和雪碧帧,则必须通过缓存类来完成。
发布于 2012-06-02 11:17:22
(
draw()和visit()方法。如果它们都放在batchNode中,那么只需调用一个draw()调用和一个visit()调用[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];https://stackoverflow.com/questions/10861550
复制相似问题