Cocos2D:CCSpriteBatchNode初始化

时间:2012-02-22 17:42:00

标签: objective-c cocos2d-iphone

我的问题与CCSpriteBatchNode的使用方式有关...当你用文件初始化CCSpriteBatchNode时,让我们说:

CCSpriteBatchNode *spriteBatch;
spriteBatch = [CCSpriteBatchNode batchNodeWithFile:@"file.pvr.ccz"];
[self addChild:spriteBatch];

然后,这是我的怀疑...为什么你需要将你将使用的每个精灵添加到CCSpriteBatchNode,如果这些精灵应该在你调用 batchNodeWithFile 时被加载?

以下是添加每个精灵的代码:

NSArray *images = [NSArray arrayWithObjects:@"sprite1.jpg", @"sprite2.jpg", @"sprite3.jpg", @"sprite4.jpg", @"sprite5.jpg", @"sprite6.jpg", nil];       
for(int i = 0; i < images.count; ++i) {
    NSString *image = [images objectAtIndex:i];
    float offsetFraction = ((float)(i+1))/(images.count+1);        
    CGPoint spriteOffset = ccp(winSize.width*offsetFraction, winSize.height/2);
    CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:image];
    sprite.position = spriteOffset;
    [spriteBatch addChild:sprite]; //Here is what I mean... Why to do this? Isn't that supposed that they are already loaded in the CCSpriteBatchNode?
}

谢谢!

1 个答案:

答案 0 :(得分:4)

这是为了优化。基本上当你向一个图层添加一个CCSprite涉及一个OpenGL调用来绘制项目时(实际上它们是7我认为),所以如果你有100个精灵,就会完成100个调用。如果将它们添加到BatchNode,则只需一次调用即可绘制所有子项。

检查文档:

  

CCSpriteBatchNode就像一个批处理节点:如果它包含子节点,它就是   将在一个单一的OpenGL调用中绘制它们(通常称为“批量绘制”)。

     

CCSpriteBatchNode可以引用一个且仅一个纹理(一个图像   文件,一个纹理图集)。只有包含在其中的CCSprites   该纹理可以添加到CCSpriteBatchNode。所有CCSprites   添加到CCSpriteBatchNode是在一个OpenGL ES绘制调用中绘制的。如果   CCSprites不会添加到CCSpriteBatchNode,而是添加到OpenGL ES   每个人都需要进行抽奖,效率较低。