如何正确使用CCSpriteFrameCache和CCSpriteBatchNode?(How do

2019-07-29 16:44发布

我不明白我要做什么时候我添加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的内存目的时,我不需要它了吗?

Answer 1:

A)最好是创造尽可能少spritesheets(CCSpriteBatchNodes)的可能。 雪碧配料减少绘图调用。 抽奖电话是昂贵的。 尽管如此,每一批节点创建一个绘制调用。 所以,你要因为最终目标是保持平局呼吁尽可能低使用尽可能少。

b)在CCSpriteBatchNode使所有的孩子在一气呵成,在一个批处理绘制调用。 这就是为什么你需要的精灵添加到批次节点,以便它可以使它们放在一起。 只有使用质地相同批次节点精灵可以被添加到一批节点,因为你只能从批次相同的纹理绘制。 每当引擎必须从一个纹理切换到另一个,它会发出一个新的绘制调用。

B1),因为该批次节点呈现其孩子你不能做到这一点。 如果添加精灵到任何其他节点,每个精灵绘制本身,这意味着每一个精灵额外绘制调用。 而精灵一批节点无关。

c)在CCSpriteBatchNode只是一个普通的节点。 您可以从场景就像任何其他节点将其删除。 纹理和精灵帧缓存在CCTextureCache和CCSpriteFrameCache单类。 如果你想从内存中删除纹理和精灵帧,你必须通过缓存类来做到这一点。



Answer 2:

  • 一)无

  • b)如果您需要在同一时间吸引众多的精灵,在少数精灵(10,20等)的情况下,我不认为你会发现任何性能提高batchNode提高你的表现。 batchNode是更快,因为OpenGL的应该借鉴,只有它看到的所有内容。 在其他情况下的OpenGL将分别绘制所有对象。 那就是-如果你有500,600,700的精灵,在draw()visit()方法将被调用的每一个。 如果他们都将被放置到batchNode,这将是唯一一个draw()调用和一个visit()调用

  • c)您可以手动清除缓存数据通过调用这些方法来强制内存释放:


[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];


文章来源: How do I properly use CCSpriteFrameCache and CCSpriteBatchNode?