Cocos2d iphone CoCoS2D2.0-一个CCSpriteBatchNode可以用于多个类吗?

Cocos2d iphone CoCoS2D2.0-一个CCSpriteBatchNode可以用于多个类吗?,cocos2d-iphone,Cocos2d Iphone,我不知道这是否可行,但我想创建一个大的纹理图集,并在应用程序的所有类上使用它 一个CCSpriteBatchNode可以用于多个类吗 假设我在主类上创建这个 [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"atlasGeral.plist"]; self.batchNodeGeneral = [CCSpriteBatchNode batchNodeWithFile:@"atlasGeral.png"];

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

一个CCSpriteBatchNode可以用于多个类吗

假设我在主类上创建这个

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"atlasGeral.plist"];
self.batchNodeGeneral = [CCSpriteBatchNode batchNodeWithFile:@"atlasGeral.png"];
[self addChild:self.batchNodeGeneral];
我有另一个类在主类上创建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
}
是否可以使用主类中的self.batchNodeGeneral对其进行优化?我的想法是用[CCSprite SpriteWithPriteFrameName:…]之类的东西来替换这两个精灵和其他精灵


谢谢

我不确定我是否完全明白,但我很确定答案是肯定的

CCSpriteBatchNode与类无关,它与资源有关。使用批处理节点的重要限制是批处理中的每个精灵都需要引用相同的纹理图集。因此,为整个应用程序使用一个批处理节点,并让每个游戏类将其自己的精灵添加到t批处理。如果您的纹理图集大于目标硬件上的最大纹理大小,这可能会成为一个实际问题。有关详细信息,请参阅iOS设备规格。但是,如果您仍然希望拥有全局批处理和大量资产,则创建一个按纹理ID索引的批处理池并不太困难,每个图集创建一个批处理节点创建一个新的精灵,将其添加到相应的批次中

老实说,我觉得整个批处理节点的事情对Cocos2D来说是一个可怕的乱七八糟的部分,可以让开发人员几乎完全透明,同时仍然保持它的效率,但是这个观点可能并不完全公平,因为我还没有深入研究渲染代码来理解他们的动机。我想这会给expe带来麻烦深度排序是如何工作的,等等,但我仍然不明白为什么批处理渲染对象是程序员的责任,它应该由引擎来完成

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

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

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

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

CCSpriteBatchNode与类无关,它与资源有关。使用批处理节点的重要限制是批处理中的每个精灵都需要引用相同的纹理图集。因此,为整个应用程序使用一个批处理节点,并让每个游戏类将其自己的精灵添加到t批处理。如果您的纹理图集大于目标硬件上的最大纹理大小,这可能会成为一个实际问题。有关详细信息,请参阅iOS设备规格。但是,如果您仍然希望拥有全局批处理和大量资产,则创建一个按纹理ID索引的批处理池并不太困难,每个图集创建一个批处理节点创建一个新的精灵,将其添加到相应的批次中

老实说,我觉得整个批处理节点的事情对Cocos2D来说是一个可怕的乱七八糟的部分,可以让开发人员几乎完全透明,同时仍然保持它的效率,但是这个观点可能并不完全公平,因为我还没有深入研究渲染代码来理解他们的动机。我想这会给expe带来麻烦深度排序是如何工作的,等等,但我仍然不明白为什么批处理渲染对象是程序员的责任,它应该由引擎来完成

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

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

因此,当您初始化一个其他类时,可以将main类实例作为参数传递,以便访问其字段。或者将main/manager类设置为singleton类,或者找到另一个适合您需要的体系结构。

谢谢,但假设您的main类有一个名为self.batchNodeGeneral的属性和一个将返回该属性的方法rty,你将如何重写我在init部分发布的代码,以使用该主类的self.batchNodeGeneral属性中的纹理?好吧,这对你来说更像是一个架构决策。你可以将你的主对象变成一个负责批处理的游戏管理器,并使其成为一个单体,这似乎是一个超级流行的特别是Cocos2D和iOS开发的选项。或者你可以让你的其他游戏类在初始化时将主类作为参数,这样他们就可以访问它。这在很大程度上取决于你的想法和你要做的事情,像这样的架构可以变得非常虔诚。好吧,但我的主要观点是:在主类上我有一行[self addChild:self.batchNodeGeneral];…在类的init部分,如何让这些行中的另一行将同一个节点再次添加到该类?听起来不对,如果我尝试,它将崩溃。@Suboptimus:我同意,sprite批处理可以
当使用纹理地图集时,uld将自动进行。强制精灵批处理的唯一缺点是,无法在其他批处理的z顺序精灵之间轻松绘制来自同一纹理图集的精灵。抱歉,我没有适当考虑您正在创建CCLayers的事实。一个CCSprite只能有一个父节点,您不能将它同时添加到层和全局sprite批处理节点,因此您将无法使用CCLayers执行此操作。不幸的是,您甚至无法使用正确的纹理将CCLayers添加到CCSpriteBatchNode,因为它只支持CCSprites作为子项。这绝对是一个烦恼,尤其是因为它限制了你在获得最佳性能的同时对精灵进行合理分组的选择。正如我所说,Cocos2D中的批处理是一个混乱的问题,它会阻止您做一些明智的事情。谢谢,但是假设您的主类有一个名为self.batchNodeGeneral的属性和一个将返回该属性的方法,您将如何重写我在init部分发布的代码,以使用该主类的self.batchNodeGeneral属性中的纹理?对于您来说,这更多是一个体系结构决策。你可以把你的主要对象变成一个游戏管理器,负责批量处理,并把它变成一个单体,这对于Cocos2D和iOS开发来说似乎是一个非常流行的选择。或者,您可以让其他游戏类在初始化时将主类作为参数,以便它们可以访问它。这在很大程度上取决于你的想法和你的目标,像这样的建筑风格可能会变得非常宗教化。好吧,但我的主要观点是:在主课堂上,我有一行[self addChild:self.batchNodeGeneral];。。。在类的init部分,如何让这些行中的另一行将同一节点再次添加到该类?听起来不对,如果我尝试,它会崩溃。@Suboptimus:我同意,sprite批处理可以而且应该在使用纹理地图集时自动进行。强制精灵批处理的唯一缺点是,无法在其他批处理的z顺序精灵之间轻松绘制来自同一纹理图集的精灵。抱歉,我没有适当考虑您正在创建CCLayers的事实。一个CCSprite只能有一个父节点,您不能将它同时添加到层和全局sprite批处理节点,因此您将无法使用CCLayers执行此操作。不幸的是,您甚至无法使用正确的纹理将CCLayers添加到CCSpriteBatchNode,因为它只支持CCSprites作为子项。这绝对是一个烦恼,尤其是因为它限制了你在获得最佳性能的同时对精灵进行合理分组的选择。正如我所说,Cocos2D中的批处理是一个混乱的过程,它会阻止您做明智的事情。