使用Cocos2d-JS制做游戏新手引导(三)源码篇

近期游戏准备出安卓版本,在安卓上的性能表现不佳。通过一周多的优化,在性能上取得了较大的提高。游戏采用 Cocos2d-x 3.2 + Lua 进行开发,如下将在渲染效率,CPU效率,包大小等方面进行总结。python


渲染效率
算法

纹理格式 – 运行效率 内存 包大小json

  • 全部的图片都经过一个python脚本(调用TexturePacker的命令行工具)自动转换为RGBA4444编码的格式。而后判断当前平台为安卓时,将默认纹理格式转换为RGBA4444。缓存

1
2
3
4
--安卓启用4444纹理
if  targetPlatform == cc.PLATFORM_OS_ANDROID then
     cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2_D_PIXEL_FORMAT_RGB_A4444)
end
  • 以上的过程会发现一种比较”反常”的现象,就是转成RGBA4444的图片要比原来的图片要大。因此在脚本中不能单纯的转换,须要对比转换先后的大小,只转换变得更小的图片。app

  • 还须要注意性能和表现的平衡。有些图片转成RGBA4444后看起来太糙,严重的影响了游戏的视觉体验。对此须要当心的针对处理。处理方法为,在这些纹理使用前将默认纹理格式设置为RGBA8888,而后当纹理使用后再将设置为以前的默认纹理格式。异步

    Alt textAlt text

    左图是没有作处理的游戏截图,可见至关不平滑的光线和背景。 右图是只针对背景和光晕的纹理设为RGBA8888处理,视觉体验一会儿就回归了。函数

  • 压缩成RGBA4444格式的PNG图片,还能够用pngquant工具进一步压缩,而视觉体验肉眼感觉几乎没有变化。这样能够进一步的减小包的大小。工具

  • RGBA4444的纹理内存使用量要比默认的RGBA8888小一半,因此能够很大的减轻游戏的内存压力。并且和PVR ETC等压缩纹理想比,能够一套代码,彻底兼容iOS和Android两大移动平台。因此我认为性价比仍是很高的。性能

纹理剪裁 – 内存 包大小优化

  • 游戏采用CocoStudio来制做骨骼动画。CocoStudio导出的骨骼动画导出的图片默认是POT(power of two)大小的。其实会形成不少空白像素的浪费,这些空白像素不只会让图片变大,还会增长纹理的内存。

  • 具体办法是:将导出的POT图片,通过美术或工具的剪裁掉多余的空白像素,使之变成NPOT(non power of two),而后修改一下plist文件中<texture>中的width和height值。对实际的使用是没有任何影响的。

  • 经过把全部POT格式的图片裁剪为NPOT,不只能够缩减图片的体积,还能减小纹理的内存占用。

DrawCall OverDraw

  • 在同事对整个包进行DrawCall和OverDraw分析后发现,消除场景内还保留着天空背景。而这层背景实际是玩家看不到,由于它彻底被消除场景挡住了。可是它会带来全屏的绘制形成了全屏范围的OverDraw,并且带来了不少额外没必要要的DrawCall。将其隐藏后,FPS在低端机上提高明显。

  • 须要把这些看不到的东西所有隐藏或移除掉,不然它们会形成OverDraw和没必要要的DrawCall,增长了GPU的负担。

  • 隐藏的办法,有些童鞋喜欢将其透明度设为0,可是这样是不会下降DrawCall的。最好的方法是将其visble设为false。

  • 还有就是场景内有不少细碎的东西,若是它们都是一张张散图储存的话,会使DrawCall居高不下,从而可能致使FPS降低。why are draw calls expensive?

  • 解决办法就是尽量的将常常一块儿出如今屏幕上的小图合并成一张大图


CPU计算

  • 避免在循环内作重复的运算。由于若是计算值在整个循环内都不会变的话,那么每次循环都去计算就是浪费CPU周期,应该将计算结果缓存在循环外部。

  • 想办法避免开销大的函数(如:开方函数,三角函数),寻找简单运算的替代方案。如:距离的比较能够不用开方先求出距离,而是直接用平方运算进行比较便可。

  • 尽量的避免同时多个的cc.RepeatForever。在低端机上发如今对较多对象调用cc.RepeatForever时,FPS降低显著。缘由多是每帧带来的计算,和所以频繁触发的Lua GC。GC是很一个十分耗费CPU的操做。

  • 优化算法,剪枝,去除冗余的计算。在游戏内的碰撞系统是这么进行优化的:原来对每个球,会遍历整个空间的碰撞体和墙壁进行碰撞检测;优化后的算法是取球当前的坐标,转换为格子坐标,而后取格子周边6个格子内的碰撞体和墙壁进行碰撞检测。效率提升了不少倍。

  • 避免频繁的开辟内存,对象最好实现复用。开辟内存也是一项很耗费CPU的操做,尤为是在移动设备上内存紧张时。对象能重用尽可能重用(创建对象池)。Lua内的表能初始化大小,尽可能先初始化大小,不然rehash的操做很费时。如何编写高性能的Lua代码

  • 用效率更高的库来替换,好比用cJson来替换Lua json,用pugixml来替代tinyxml2。或者将效率低的模块尝试用更低级的语言进行重写。

  • 出包时,关掉全部的print语句和cclog语句。大家都知道输出到缓冲区的log有多卡。


其余

异步加载

  • 预测即将用到的纹理和资源,将其进行异步加载。这样能在用到时,减小掉纹理加载的时间,感受上会更流畅一些。

移除不用的库

    • 因为引擎使用的是Cocos2d-x 3.2版本,因此没有3.3带来的模块精简的功能。可是咱们也能够本身去当心翼翼的移除掉游戏根本不会用到的模块。好比:物理引擎,3d模块,CocosBuilder spine等等。

    • 具体的方法是:经过adt的打包日志,分析有哪些库被编译进最终的so文件中,而后去项目内一个一个搜索这些库的名称。找到其对应的Android.mk文件,而后尝试移除掉无用库文件,而后尝试编译,确保游戏能正确运行。

相关文章
相关标签/搜索