在Cocos开发者沙龙北京站上,触控科技高级技术经理杨潇分享《使用PowerVR SDK优化Cocos 3D游戏引擎》以下为此次演讲实录。
杨潇:大家好!我叫杨潇,主要负责Cocos 3D方面。
在讲之前先做一个调查,用过Cocos里面3D功能的举一下手,谢谢大家。比我想象的好一点,其实我们这个3D起步不是特别早,我这次主要给大家讲一下3D的优化技巧,用的是PowerVR的SDK,里面有一些优化工具,我们的引擎也会进行一些改进。有一些不是特别方便在引擎层修改的,在这里我会给大家一些建议可以在游戏层面进行修改,做游戏的时候这些方面就需要注意。如果想进一步提高性能,可以用PowerVR SDK看一下性能瓶颈在什么地方。
我们的3D从2014年的3.1开始,3.1版本主要是静态模型obj文件。3.2的时候,我们加入了自己的文件格式,c3t和c3b。到3.3的时候,对模型支持就比较好了,可以进行一些换装操作,同时又加入了相机,灯光的支持。在3.4的时候,又加了一些视频裁剪、异步加载。3.5的时候加入了3D粒子,支持Particle Universe导出的粒子,Particle Universe编辑器主要是给端游打造的,可以做出非常华丽的粒子效果。3.6的时候加入了地形和天空盒,这样可以做一些比较大的室外场景。到3.7的时候加入了物理,导航,还有材质系统。3.8进行了其它的改进,前段时间3.9已经发布了。通过3.1—3.8的发展,3D功能比较成熟了。
这是用PowerVR工具做的Profile,根据这个可以看出有哪些需要改进的地方。它有两个端,一端是装在手机端,手机启动起来就是这样的。在这个里面可以把服务起来,在PC端是这种界面,通过一个IP地址连到手机上,手机的一些信息,图形层面的性能信息,可以展示出来。
主要信息是通过图形的方式展示出来,通过这个可以直观的看到游戏渲染的各个环节性能消耗情况。
除了性能分析,CPU&GPUoverload、Vertex processing、Fragment processing、Bandwidth,我们还可以分析出其它的指标,比如vertex per triangle,如果顶点排序比较合适的话,这个值是比较小的,这说明顶点变化没有白费,效率非常高。对于我们来说,1.5还稍微高一点,后面会告诉大家怎么优化这个指标。还有Triangle culled,有很多顶点已经做了变换,但最后发现可以直接被裁剪掉,这个指标说明你裁剪的效率不高,这个是80.2%,也是指标偏高。然后是ISP overload,这个指标也偏高,主要由于我们程序中有大量的overdraw存在。
下面看一下针对这些提示怎么优化。这就是几个指标的解释。首先,减少带宽和DrawCall。第二,裁剪。第三,减少overdraw。第四,减少vertex pertriangle。第五减少texture load&Texture overload。第六,matrix palettesize。
减少带宽和DrawCall,合并QuadCommand,instance draw等。改进策略:Cocos已经支持合并相同纹理的相邻Sprite的drawcall。
裁剪:关于裁剪,整个Cocos引擎也支持CPU裁剪,Cocos已经支持视椎裁剪。开发者要避免使用超大几何体,室外场景使用地形。比如整个屋子做了一个模型,把相机放在这个屋子的任何位置,这个屋子都只能提交到GPU,没办法做裁剪。如果把它分成比较小的模型,比如椅子,以及我身后的投影等,这样相机往前看的时候,后面那个投影就可以被排除掉。做模型的时候要做合适大小的模型。
减少Overdraw,不透明物体关闭alphablend,shader中避免discar指令。改进策略,Cocos:3D不透明队列关闭alpha blend(v3.9)。开发者:Discard指令是否使用自行决定。
降低vertex pertnangle,使用imagination的tnangle sort算法排序。改进策略,Cocos正在将triangle sort算法集成到fbx—conv中,预计V3.10中发布。
减少Textureload&Texture overload,场景的2K×2K的贴片太大。改进策略,Cocos:3D不透明队列关闭alpha blend(v3.9),开发者:尽量避免超大场景及贴图。
减少matrixpalette size fbx—conv—n 8,修改shader SKINNING_JOINT_COUNT=8。改进策略:Cocos:减少Matrixpalette size而可能引起模型的拆分,无法确定是否最优,留与快法这根据游戏自行处理。开发者:开发者根据自己模型包含最大骨骼数进行调整。
总结一下对开发者的建议。第一,减少三角形面数,使用尽量少的三角形。这也是非常容易理解的,三角形的数量越少,效率肯定越高,但还要平衡一下效果,做一些折中。
第二,尽量使用静态光照。动态光照对性能影响比较大的。
第三,优化command的顺序。对于2D Sprite相同Texture的尽量使它们在渲染队列中的顺序相邻,这样Cocos会自动batch这些drawcall,对于不透明Sprite3D,我们希望开发者按由近及远的顺序加入渲染队列,引擎内部没有给大家做这种排序,因为在PowerVR里面有HSR不需要排序即可保证一个像素点只绘制一次,但是高通的中低端GPU并没有这个功能,通过排序可以减少Overdraw提高渲染效率。
第四,不使用超大模型。超大模型不利于CPU裁剪。
第五,定制shader,根据游戏模型情况设置合理的matrix palette size,简化shader去除不必要的光照计算。第六,armv7,安卓下打开armv7编译选项,application.mk中加上App_ABI:=armebi armeabi_v7a。
简单总结一下,做一款比较好的游戏,GPU厂商会指出我们的性能在哪里,我们根据一些优化建议进行改进,改进的时候需要多方合作,我们Cocos引擎可以根据他的建议做一些改进。但有一些方面不太方便Cocos引擎改进的,因为我们这是一个开源的引擎,有一部分开发者可以进行改进,把游戏性能提高。
我的分享就到这儿,谢谢大家!
Cocos开发者沙龙北京站PPT下载:http://pan.baidu.com/s/1eQ6WaeI
欢迎大家继续关注和参与Cocos开发者沙龙,Cocos君也会为你带来更多干货哦。