目前的硬件水平足以支持大部分非3D游戏,drawcall的场景基本上不会有超过一百的情况,2D游戏的顶点数基本上可以忽略。
一.内存优化
1.内存泄漏
在最近的项目中使用了C11的智能指针,经过一年的使用证明这是不是一个成功的选择。虽然已经没了自己管理的烦躁,但是增加了内存泄漏的几率。毕竟不是所有人都能完全理解和掌握shared_ptr的使用。 建议使用cocos2dx自带的轻量级智能指针,采用了引用计数,并且没有了C11智能指针循环引用及其他使用容易导致引用计数异常的问题。
这里有以前写的总结,处理C11智能指针的内存泄漏,关键是第四点,切忌安全使用。
2.缓存(材质缓存,精灵帧缓存)管理
这里必须要引入过渡场景,用于removeunused的缓存,然后预加载下一个场景需要使用的资源。 并且cocos2dx提供了api可以查看内存中所有的缓存,做为开发必须能完全熟知内存中的这些缓存,能及时判断哪些材质是多余的。
这里要多提的一点是,不使用jpg,android使用pkm,ios使用pvr是非常有必要的。特别对于8000*8000超大地图。
3.高性能对象池
传统对象池只有一个list保存所有对象,每次使用循环遍历查找未使用的对象。
这里的优化是新增一个队列保存所有可使用的对象。每次对象使用完进行push_front的操作,每次使用通过pop_front获取。
二.cpu优化
1.近似数学函数
开方、三角函数近似替换算法,计算两点间的距离(曼哈顿距离、牛顿迭代或者使用平方数值做比较),位移运算(针对频繁的乘除2的n次幂)等。
2.算法
在算法的选择上其实渗透在我们的每一个即使非常小的功能模块,对于不是专门研究算法的我们,算法更多是一种意识。拒绝所有的时间复杂度O(n*n)的操作,永不高估cpu的计算性能,在现有的操作上力求更低的计算量。 然后有的放矢的去选择适合自己项目的算法。
3.分帧
三.GPU优化(Drawcall优化)
1.超大图的切片
切片太小对于drawcall是非常有影响的,目前使用最大化切片2048*2048,并且图片使用压缩格式使用存在于缓存中。
2.合图(多摄像机场景)
对于摄像机比较多的场景,由于底层是遍历摄像机,每个摄像机执行一次场景的全部绘制。
所以在合图的时候需要按照摄像机来分层合图,不要把不同摄像机的图片合到一起。
3.粒子特效的选择。
切忌使用pu
4.通用艺术字图集代替默认字体。
补充:
四.3D模型的优化
顶点数即面数,要限制。
模型材质大小限制。
动作帧数限制。
模型动画预创建。