Objective c 如何正确使用CCSpriteFrameCache和CCSpriteBatchNode?

Objective c 如何正确使用CCSpriteFrameCache和CCSpriteBatchNode?,objective-c,ipad,cocos2d-iphone,ccsprite,Objective C,Ipad,Cocos2d Iphone,Ccsprite,我不明白我在向cocos2d应用程序添加CCSpriteFrameCache或CCSpriteBatchNode时到底做了什么。有人能解释以下几点吗(如果你能解释几点,那会很有帮助;请根据你回答的问题在你的答案前写上相应的信): [所有问题都意味着实现了最佳性能和最低内存使用率] a)为每一层创建精灵表是否至关重要?(例如:菜单-自有精灵表,游戏玩家-自有精灵表…) b)有人能解释为什么我必须向批处理节点添加精灵,以及批处理节点通常是什么吗? b1)那么,为什么我不能像这样做: [[

我不明白我在向cocos2d应用程序添加CCSpriteFrameCache或CCSpriteBatchNode时到底做了什么。有人能解释以下几点吗(如果你能解释几点,那会很有帮助;请根据你回答的问题在你的答案前写上相应的信):

[所有问题都意味着实现了最佳性能和最低内存使用率]

a)为每一层创建精灵表是否至关重要?(例如:菜单-自有精灵表,游戏玩家-自有精灵表…)

b)有人能解释为什么我必须向批处理节点添加精灵,以及批处理节点通常是什么吗?

b1)那么,为什么我不能像这样做:

      [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"menusprites.plist"];
       CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"menusprites.png"];
      [self addChild:spriteSheet];
然后通过调用

CCSprite *mySprite = [CCSprite  spriteWithSpriteFrameName:@""]; 
[self addChild:mySprite];
不将它们添加到批处理节点?因为据我所知,它是这样工作的:

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

[spriteSheet addChild:mySprite];
?

c)当我不再需要spritesheet时,如何将其丢弃以用于存储目的?
  • a) 没有

  • b) 当您需要同时绘制多个精灵时,batchNode会提高性能,如果精灵数量较少(10、20等),我认为您不会注意到任何性能的提高。batchNode要快得多,因为opengl应该只绘制它来查看所有内容。在其他情况下,opengl将分别绘制所有对象。也就是说,如果您将有500600700个精灵,那么将为每个精灵调用
    draw()
    visit()
    方法。如果它们都将被放置到batchNode,则只有一个
    draw()
    调用和一个
    visit()
    调用

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


a) 最好创建尽可能少的spritesheet(CCSpriteBatchNodes)。Sprite批处理减少了draw调用。抽签电话很贵。不过,每个批处理节点都会创建一个绘图调用。因此,您希望使用尽可能少的调用,因为最终目标是将draw调用保持尽可能低

b) CCSpriteBatchNode在一次批处理绘制调用中一次性呈现其所有子节点。这就是为什么需要将精灵添加到批处理节点,以便它可以一起渲染它们。只能将使用与批处理节点相同纹理的精灵添加到批处理节点,因为只能从同一纹理进行批处理绘制。每当引擎必须从一种纹理切换到另一种纹理时,它都会发出新的绘制调用

b1)无法执行此操作,因为批处理节点渲染其子节点。如果将精灵添加到任何其他节点,则每个精灵都会绘制自身,这意味着每个精灵会有一个额外的绘制调用。而sprite批处理节点与此无关


c) CCSpriteBatchNode只是一个常规节点。可以像从任何其他节点一样将其从场景中移除。纹理和精灵帧缓存在CCTextureCache和CCSpriteFrameCache单例类中。如果要从内存中删除纹理和精灵帧,必须通过缓存类进行操作。

我现在明白了。。。要完全理解正在发生的事情总是需要一些时间,但现在我明白了,谢谢。哇!自从我开始使用Cocos2d以来,我刚刚获得了最棒的AHA体验。我不敢相信我以前没收到这个。我最近一直在努力创建一个六边形磁砖引擎,保持稳定的50-60FPS,但我不明白为什么它很慢,尽管我只有一种使用batchnode的磁砖类型。但是我犯了一个错误,把精灵也放在了另一个节点上,并且不断地收到70-80个绘制调用,要求屏幕上所有可见的瓷砖。我会尝试这一点,只要我得到我的手在我自己的电脑上再次。谢谢你,斯蒂芬!那么,我们可以使用的SpriteSheet的数量有没有预定义的限制?下面是一个由代码和web组成的非常好的三部分解释-
[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];