首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用CCSpriteFrameCache和CCSpriteBatchNode?

如何正确使用CCSpriteFrameCache和CCSpriteBatchNode?
EN

Stack Overflow用户
提问于 2012-06-02 10:25:42
回答 2查看 5.7K关注 0票数 8

当我将CCSpriteFrameCache或CCSpriteBatchNode添加到CCSpriteBatchNode应用程序时,我不明白我到底要做什么。有谁能解释一下以下几点(如果你能解释几点,请在你回答的问题前面写一封相应的信):

所有问题都意味着获得最佳的性能和最低的内存使用。

a)为每一层创建spritesheets是至关重要的吗?(例如:菜单自己的spritesheet,GameLayer自己的spritesheet.)

b)有人能解释为什么我要在批处理节点中添加精灵,以及批处理节点通常是什么?

(b1)那么,为什么我不能做这样的事情:

代码语言:javascript
复制
      [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"menusprites.plist"];
       CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"menusprites.png"];
      [self addChild:spriteSheet];

然后通过调用

代码语言:javascript
复制
CCSprite *mySprite = [CCSprite  spriteWithSpriteFrameName:@""]; 
[self addChild:mySprite];

而不将它们添加到批处理节点?因为据我所知,它是这样工作的:

我将带有所有精灵的spritesheet添加到屏幕上。然后,我的应用程序进入plist,查找我想要显示的sprite的坐标,然后将它放在屏幕上。那我为什么要打电话

代码语言:javascript
复制
[spriteSheet addChild:mySprite];

c)当我不再需要它时,如何为了内存的目的而去掉它呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-02 11:19:10

( a)最好尽可能少创建spritesheets (CCSpriteBatchNodes)。雪碧批处理减少了抽签呼叫。抽奖电话太贵了。不过,每个批处理节点都会创建一个抽签调用。因此,您希望使用尽可能少,因为最终目标是保持尽可能低的抽签调用。

( b) CCSpriteBatchNode在一次抽签中一次将所有的子调用都呈现出来。这就是为什么您需要向批处理节点添加sprites,这样它就可以将它们全部呈现在一起。只有使用与批处理节点相同的纹理的精灵才能添加到批处理节点,因为您只能从同一纹理进行批处理绘制。每当引擎不得不从一种纹理切换到另一种纹理时,它就发出一个新的抽签调用。

b1)您不能这样做,因为批处理节点呈现它的子节点。如果将精灵添加到任何其他节点,那么每个sprite都会自己绘制,这意味着每个sprite会增加一个抽签调用。而且sprite批处理节点没有什么可做的。

c) CCSpriteBatchNode只是一个普通的节点。您可以像其他节点一样将其从场景中移除。纹理和精灵帧缓存在CCTextureCache和CCSpriteFrameCache单例类中。如果要从内存中删除纹理和雪碧帧,则必须通过缓存类来完成。

票数 14
EN

Stack Overflow用户

发布于 2012-06-02 11:17:22

(

  • a)没有
  • b)当你需要同时绘制多个精灵时,batchNode会提高你的性能,如果有少量的精灵(10,20等等)。我认为你不会注意到任何表现的增加。batchNode的速度要快得多,因为opengl应该只绘制它来查看所有的内容。在其他情况下,opengl将分别绘制所有对象。也就是说,如果您有500,600,700个精灵,那么将为每个方法调用draw()visit()方法。如果它们都放在batchNode中,那么只需调用一个draw()调用和一个visit()调用
  • c),就可以手动清除缓存的数据,通过调用以下方法来强制释放内存:

代码语言:javascript
复制
[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10861550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档