1

我不知道这是否可能,但我想创建一个大纹理图集并将其用于应用程序的所有类。

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

假设我在主类上创建它

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"atlasGeral.plist"];
self.batchNodeGeneral = [CCSpriteBatchNode batchNodeWithFile:@"atlasGeral.png"];
[self addChild:self.batchNodeGeneral];

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

-(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
}

这可以使用主类中的 self.batchNodeGeneral 进行优化吗?我的想法是用类似[CCSprite spriteWithSpriteFrameName:...

谢谢

4

1 回答 1

5

我不完全确定我是否遵循,但我很确定答案是肯定的。

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

老实说,我觉得整个批处理节点的事情对于 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
}
`

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

于 2012-06-09T20:10:47.350 回答