6

我有一个CCSpriteBatchNode这样的配置:

CCSpriteBatchNode
    ChildA1
        ChildB1
        ChildB2
        ....
        ChildB999
    ChildA2
    ChildA3
    ...

所有孩子(ChildA1,ChildB1,ChildA2 ...)都是CCSprite对象。CCSpriteBatchNode和所有子代但是ChildA1通过以下方式创建:

[CCSprite spriteWithSpriteFrameName:@"FileName.png"];

ChildA1是这样创建的:

// Create Parent Sprite
CCSprite* childA1 = [[CCSprite alloc] init];
childA1.contentSize = CGSizeMake(37.5,37.5);
childA1.anchorPoint = ccp(0,0);
[batchNode addChild:childA1 z:0 tag:1];

// Add Child Sprites
[childA1 addChild:childB1 z:0 tag:1];
[childA1 addChild:childB2 z:0 tag:1];
[childA1 addChild:childB3 z:0 tag:1];
// Continue adding childB4-childB999

注意:这渲染得很好,我看到了我期望的输出,其中childB1的位置相对于childA1,并且移动childA1导致childB1移动。

我的问题是:我是否会在每个childB1-的绘图中看到性能提升childB999?据我了解,通过将所有子元素绘制在一起来CCSpriteBatchNode优化 a 中所有子元素的CCSpriteBatchNode绘制CCSprites。这是否也适用于那些孩子CCSprites

对于那些想知道我为什么这样做的人:这个游戏中有很多层,并且CCSprites在 aCCSprite内分组CCSpriteBatchNode允许我CCSprites通过仅操纵该组精灵的父级来操纵一组。

4

1 回答 1

2

简短的回答是,是的,CCSpriteBatchNode将对所有子节点(包括所有间接后代)进行一次绘制调用。

但是,这是否比使用常规效果更好CCSprites取决于您修改精灵的频率。使用 aCCSpriteBatchNode时,每次修改精灵时,都需要使用 CPU 而不是 GPU 重新计算该精灵及其所有子对象的纹理图集四边形坐标。对于您的示例,如果您移动 的位置,则将在渲染下一帧之前重新计算toChildA1的坐标。在大多数应用程序中,openGL 绘制调用的减少会加重额外计算的成本,因为绘制调用相对昂贵,但最终它将取决于您的应用程序以及它如何使用精灵——所以我建议对如果这是一个性能瓶颈,您的应用程序。ChildB1ChildB999

于 2013-02-22T06:02:18.477 回答