我不明白我要做什么时候我添加CCSpriteFrameCache或CCSpriteBatchNode我的cocos2d的应用程序。 可有人请解释下点(这将是有益的,如果你能解释一些,请根据该问你的回答写在你的答案前对应的字母):
[所有问题暗示的最佳性能和最低的内存使用的成就]
一)它是至关重要的,每一层创建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,以寻找我想要显示的精灵的坐标,然后放置在屏幕上。 所以我为什么要叫
[spriteSheet addChild:mySprite];
?
C)我怎么那么摆脱spritesheet的内存目的时,我不需要它了吗?
A)最好是创造尽可能少spritesheets(CCSpriteBatchNodes)的可能。 雪碧配料减少绘图调用。 抽奖电话是昂贵的。 尽管如此,每一批节点创建一个绘制调用。 所以,你要因为最终目标是保持平局呼吁尽可能低使用尽可能少。
b)在CCSpriteBatchNode使所有的孩子在一气呵成,在一个批处理绘制调用。 这就是为什么你需要的精灵添加到批次节点,以便它可以使它们放在一起。 只有使用质地相同批次节点精灵可以被添加到一批节点,因为你只能从批次相同的纹理绘制。 每当引擎必须从一个纹理切换到另一个,它会发出一个新的绘制调用。
B1),因为该批次节点呈现其孩子你不能做到这一点。 如果添加精灵到任何其他节点,每个精灵绘制本身,这意味着每一个精灵额外绘制调用。 而精灵一批节点无关。
c)在CCSpriteBatchNode只是一个普通的节点。 您可以从场景就像任何其他节点将其删除。 纹理和精灵帧缓存在CCTextureCache和CCSpriteFrameCache单类。 如果你想从内存中删除纹理和精灵帧,你必须通过缓存类来做到这一点。
一)无
b)如果您需要在同一时间吸引众多的精灵,在少数精灵(10,20等)的情况下,我不认为你会发现任何性能提高batchNode提高你的表现。 batchNode是更快,因为OpenGL的应该借鉴,只有它看到的所有内容。 在其他情况下的OpenGL将分别绘制所有对象。 那就是-如果你有500,600,700的精灵,在draw()
和visit()
方法将被调用的每一个。 如果他们都将被放置到batchNode,这将是唯一一个draw()
调用和一个visit()
调用
c)您可以手动清除缓存数据通过调用这些方法来强制内存释放:
[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];