近段时间在使用cocos2d-x开发2D手游,技术方案使用的是cocos2d-x+lua,因为游戏使用的是cocos2d-x 2.1.5版本,有些优化方案在最新版的cocos2d-x版本已经实现了。这篇文章主要是总结在使用cocos2d-x2.x版本+lua技术方案时遇到的问题和一些性能优化总结。
因为我使用的cocos2d-x2.1.5版本,引擎并没有实现自动批渲染,底层也改动了不少代码,不太方便直接升级到3.0版本,这里参考了cocos2d-x3.0版本,修改了引擎代码加入自动批渲染。很大程度的降低了draw call批次,比使用CCSpriteBatchNode操控起来更加便捷,CCSpriteBatchNode需要把子节点在逻辑层面手动添加到父节点,逻辑控制比较复杂,特别当精灵节点分布不连续的时候,自动批渲染可以解决这个问题。通过改写精灵类的draw函数,把精灵信息添加到渲染队列,不进行绘制。等到一帧结束或者遇到非精灵节点绘制时才批量绘制渲染队列中的精灵。在绘制之前会对渲染队列中的精灵按逻辑层设置的z值进行排序,一般把相同材质ID(根据textureID+blendFunc+shaderProgram生成材质ID)的精灵设置相同或邻近的z值,根据精灵的模型视图矩阵信息得到世界坐标,在节点发生变换的时候更新模型视图矩阵信息( CCNode::transform()函数)。
1
|
kmGLGetMatrix(KM_GL_MODELVIEW,&_modelViewTransform);
|
这样就可以把非连续性分布但同材质ID的精灵批量进行绘制,一个批次可以绘制多个精灵,大大减少了draw call批次,降低cpu的消耗(帧率提高时也会导致cpu消耗变高)。整个流程如下图所示:
1
2
3
4
5
6
7
|
local item
=
CCBReaderLoad(
"equip_item.ccbi"
,proxy,true,itemOwnerName);
item
tolua.cast(item,
"CCSprite"
);
.......
local nWidth,nHeight
=
150
100
;
item:renderToTex(nWidth,nHeight);
cell:addChild(item,0)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important; background:none!important">0
c++代码
猜你在找的Cocos2d-x相关文章 |