CCSpriteBatchNode,sheet,z

原文链接:http://blog.sina.com.cn/s/blog_b80b9bca0101ez17.html

每当cocos2d在屏幕上回执一个纹理(一张图片)时,图形硬件都需要做前后三个动作:准备渲染、渲染图形和渲染后的清除。这些工作产生了一个纹理所共有的开销。如果要缓解此状况(大量的图形渲染造成大量的开销),就需要让硬件知道需要进行渲染的这一组精灵使用的是同一纹理。这样图形硬件就会为这组精灵只进行一次准备、渲染和清除的工作。

在cocos2d 程序里,大家都看到了左下角的FPS变成3行,多了两行数据。

最上面一行是指的当前场景的渲染批次。(简单理解为需要渲染多少个贴图出来)

中间一行是渲染每一帧需要的时间。

最下行就是大家熟悉的FPS。

CCSpriteBatchNode介绍:

1、先说下渲染批次:这是游戏引擎中一个比较重要的优化指标,指的是一次渲染凋用。也就是说,渲染的次数越少,游戏的运行效率越高。

2、CCSpriteBatchNode就是cocos2d为了降低渲染批次而建立的一个专门管理精灵的类。

举例介绍:

1、使用CCSprite创建1000个Icon.png到场景中,这样渲染批次就是1000(暂且不考虑其他的精灵)

for(int i = 0;i < 1000;++i){

    int x = arc4random()�0;

    int y = arc4random()d0;

    CCSprite* testIcon = CCSprite::create("Icon.png");

    testIcon->setPosition( ccp(x, y) );

    this->addChild(testIcon);

}


创建了1000个Icon到场景中,这是的FPS是22,渲染批次是1000次。

2、使用CCSpriteBatchNode批量渲染,一次渲染就把所有的CCSprite绘制出来。大大降低渲染批次。

举例介绍:

1、使用CCSprite创建1000个Icon.png到场景中,但是这里利用了CCSpriteBatchNode批量渲染。这时的渲染批次、FPS如何呢?

CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("Icon.png", 1000);

batchNode->setPosition(CCPointZero);

this->addChild(batchNode);


for(int i = 0;i < 1000;++i){

    int x = arc4random();

    int y = arc4random();

    CCSprite* testIcon = CCSprite::createWithTexture(batchNode->getTexture());

    testIcon->setPosition( ccp(x, y) );

    batchNode->addChild(testIcon);

}

创建了1000个Icon到场景中,这是的FPS是39.9,渲染批次是1次。

注:

1、
CCSpriteBatchNode::create(const char *fileImage);//利用贴图创建,默认子节点数量29.(数量不够时,系统会自己增加)
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create(const char *fileImage, unsigned int capacity);//利用贴图创建,并指定子节点数量

2、

使用CCSpriteBatchNode时,所使用的贴图必须是同一张图片,也不能指定精灵的深度。所有的精灵都必须在同一渲染层。

但是如果你使用纹理图册(纹理图册中可以有很多不同的图像)时,就能和好的解决这个问题。实际上当使用纹理图册时,也可以很好的解决z值问题,比如说,把怪物图片添加到纹理图册中。
同一个CCSpriteBatchNode上添加的子节点的z值只能在CCSpriteBatchNode调整绘制的顺序。这样的话你如果想创造显示在一个怪物上的子弹和显示在怪物下的子弹,你需要创建两个CCSpriteBatchNode,通过调整CCSpriteBatchNodez值达到效果

3、

但是项目中总不可能局限于一张贴图上,所以你可以把多张贴图合并成一张大贴图(合并的工具很多,我不介绍了)。所以利用合成后的大贴图创建一个CCSpriteBatchNode。
然后创建CCSprite的时候,设置贴图的区域就可以了。


你可能感兴趣的:(CCSpriteBatchNode,sheet,z)