Cocos2D 2.0 - 一个CCSpriteBatchNode可以用于多个类吗?

Spa*_*Dog 1 cocos2d-iphone

我不知道这是否可行,但我想创建一个大的纹理图集并在应用程序的所有类上使用它.

一个CCSpriteBatchNode可以用于多个类吗?

假设我在主类上创建了这个

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"atlasGeral.plist"];
self.batchNodeGeneral = [CCSpriteBatchNode batchNodeWithFile:@"atlasGeral.png"];
[self addChild:self.batchNodeGeneral];
Run Code Online (Sandbox Code Playgroud)

我有另一个在主类上创建CCLayers的类,在使用CCSpriteBatchNode之前已初始化,如下所示:

-(id) init 
{

   if( (self=[super init])) {

        self.bg = [CCSprite spriteWithFile: @"cCircularBG.png"];
        [self addChild:self.bg];

        self.dr = [CCSprite spriteWithFile: @"cCircularDR.png"];
        [self addChild:self.dr];      
  }
  return self;  // self is a CCLayer
}
Run Code Online (Sandbox Code Playgroud)

可以使用主类中的self.batchNodeGeneral进行优化吗?我的想法是用[CCSprite spriteWithSpriteFrameName:...替换这两个精灵和其他精灵.

谢谢

Sub*_*mus 5

我不完全确定我会效仿,但我很确定答案是肯定的.

CCSpriteBatchNode与类没有任何关系,它与资产有关.批处理节点使用的重要限制是批处理中的每个sprite都需要引用相同的纹理图集.因此,为整个应用程序创建一个批处理节点并让每个游戏类都将自己的精灵添加到该批处理中是完全没问题的.如果您的纹理图集大于目标硬件上的最大纹理大小,则可能会变成实际问题(有关详细信息,请参阅iOS设备规范),但如果您仍希望拥有全局批次和大量资源,则创建起来并不难由纹理ID索引的批处理池,每个地图集创建一个批处理节点,每当您创建新的sprite时,将其添加到相应的批处理中.

老实说,我觉得整个批处理节点的事情是Cocos2D的一个糟糕的问题,可以让开发人员几乎完全透明,同时仍然保持其效率,但也许这种观点并不完全公平,因为我没有在渲染中挖掘代码,以了解他们的动机.我想它会混淆深度排序的工作方式等等,但我仍然不明白为什么批处理渲染对象是程序员的责任,应该由引擎来完成.

编辑以添加可能的解决方案

-(id) initWithMainClass:(MainClass*)mc
{

   if( (self=[super init])) {

        self.bg = [CCSprite spriteWithSpriteFrameName: @"cCircularBG.png"];
        [mc.batchNodeGeneral addChild:self.bg];

        self.dr = [CCSprite spriteWithSpriteFrameName: @"cCircularDR.png"];
        [mc.batchNodeGeneral addChild:self.dr];      
  }
  return self;  // self is a CCLayer
}
`
Run Code Online (Sandbox Code Playgroud)

因此,在初始化其他类之一时,将主类实例作为参数传递,以便可以访问其字段.或者使main/manager类成为单例或找到适合您需求的另一种架构.

  • @Suboptimus:我同意,sprite批处理可以并且应该在使用纹理图集时自动化.强制sprite批处理的唯一缺点是来自相同纹理图集的精灵不能在其他批次的(z顺序)精灵之间绘制. (3认同)
  • 对不起,我没有正确考虑你正在创建CCLayers的事实.CCSprite只能有一个父级,您不能将它添加到层和全局精灵批处理节点,因此您将无法使用CCLayers执行此操作.遗憾的是,您甚至无法将CCLayers添加到具有正确纹理的CCSpriteBatchNode,因为它仅支持CCSprites作为子项.绝对是一种烦恼,特别是因为它限制了您的选择,以便在获得最佳性能的同时合理地分组您的精灵.就像我说的那样,在Cocos2D中的批处理是一个kludge,并阻止你做出明智的事情. (2认同)