关于游戏渲染优化发面的疑问

最近在进行游戏的优化工作,因为游戏运行手机发热严重,今天看到了一片版主的帖子,http://www.cocoachina.com/bbs/read.php?tid=196135&page=1&toread=1#tpc
是关于渲染发面的优化的,自己尝试了下,发现效果很好,但也碰到了问题。关于编辑器制作的特效,Armature* armature = Armature::create( “colour” );在同一个界面同时播放多个特效时,如何进行上面的优化呢?毕竟特效里面也是一些图片,还是说cocos2dx里面其实已经做好了优化?
求解答。同时希望同学们能提供些关于游戏优化发面的想法,多谢 多谢

截取一段上面提到的版主的帖子内容方便同学们查看方法就是使用CCSpriteBatchNode和CCParticleBatchNode精灵批节点类和粒子批节点类。先来看看在代码中如何使用它们。

CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
//创建了十个精灵将这十个精灵添加到当前的层中
for(int i=0;i<10;i++)
{
CCSprite * sprite = CCSprite::create(“icon.png”);
sprite->setPosition(ccp(CCRANDOM_0_1()*visibleSize.width,CCRANDOM_0_1()*visibleSize.height));
this->addChild(sprite);
}

上边的这种情况是采用一般的方式将精灵添加到层中的,这个时候的渲染批次是10。

//创建一个CCSpriteBatchNode,传入的参数就是精灵们将要用到的图片
CCSpriteBatchNode * batchNode = CCSpriteBatchNode::create(“icon.png”);
//或者使用texture2d初始化,里边传入一个texture
//CCSpriteBatchNode * batch = CCSpriteBatchNode::createWithTexture();
//这一句写不写都可以,因为node的默认坐标就是(0,0)
batchNode->setPosition(CCPointZero);
for(int i=0;i<10;i++)
{
//创建的这些精灵所使用的纹理必须和CCSpriteBatchNode相同,而且所有这些精灵必须在同一个渲染层
CCSprite * sprite = CCSprite::createWithTexture(batchNode->getTexture());
sprite->setPosition(ccp(CCRANDOM_0_1()*visibleSize.width,CCRANDOM_0_1()*visibleSize.height));
batchNode->addChild(sprite);
}
this->addChild(batchNode);

采用上边的方法添加精灵到层中,渲染批次是1

引擎3.x的版本后不是已经aotubatch了吗

对 aotubatch 不了解,查了下只是有简答的说明,这个是aotubatch是自动实现的吗?如果自动实现的话,为什么我用 spritebathnode的效果会这个好呢?发两张图对比spritebathnode前后

这个是使用spritebathnode 之后的

看到一篇帖子关于autobatch的 http://www.cocoachina.com/bbs/read.php?tid=203666,大致理解了autobatch,但是似乎autobatch有缺陷而且并不适合我上面提出的问题,我的特效图片明显不是单张连续的。继续求解

感谢楼主提供资料,这个我还真没有注意,我先自己测试试一下

cocos2dx 3.x的draw call优化的原理大概是这样的,拿QuadCommand举例子,依次读取渲染队列中的command,如果相邻的command的textureID一样,就会把顶点数组先缓存起来,一直到下一个command不是QuadCommand或者textureID不一致或者顶点缓存达到上限,然后一并渲染之前缓存的所有命令。
所以要自己做优化的话,就尽量让纹理相同的Armature在同一层上,尽可能的让它们在渲染队列中的位置是连续的。
触控也说了3.x不建议使用spritebatchnode,大概是在3.0左右的版本release note提到的。

多谢你的回答,了解了

你第二张图的draw call减少了。但帧数反而减低了。。。。

之前我也纠结过这个问题,试验了下spritebatchnode发现并么有效果,问论坛里的几个大神,告诉我3.x不用spritebatchnode了,会自动优化。
于是我就放弃了。今天看了楼主的贴,才明白这又是一个坑啊。。。。。。:12: