UNITY3D手游优化3 优化无止境
发表于2016-12-20
经过前面几轮的规范和优化,除了几分钟一次的GC外,游戏的性能Profiler图应该是这样:
继续优化首要问题是要找到HOT点.
首先我们要定位瓶颈到底是在CPU,还是GPU.这里可以采用AdrenoProfiler,屏蔽GL的调用.如果屏蔽后,FPS有显著提升,证明瓶颈在GPU,否则在CPU.
一般优化到后期,优化一轮后, 瓶颈需要重新定位.以确保每个优化方向都是有效的.相关截图效果如下:
假如瓶颈在GPU.首先我们要检测渲染相关指标是否达到之前定的标准,然后可以用UNTIY查看下OverDraw的情况.基本问题排查完后,我们还可以继续用Adreno Profiler截图.
看下渲染的大头部分在哪里.截图效果如下:
渲染一个单元的开销高,有可能是顶点/渲染像素过多,也有可能是shader过于复杂.
对于前者,我们重点排查过多元素是否合理.有些开销高,可能由于低级错误导致的.比如用全透明Image做UI的点击层
对于后者,我们可以实时在AP里面把shader改成最简单的shader,做一个基本的排除.
假如瓶颈在CPU,由于Unity_Profiler只有瞬时占用消耗,并不能给出定量的消耗占比.优化方向需要引入一个全局Profiler来做数据支撑.
我们可以根据以下两点在应用层获取到全局性能占用百分比的数据.
1、UNITY3D自带事件函数的执行顺序(细节见:http://www.jianshu.com/p/1d93ece664e2)
2、父节点的事件函数优先于子结点
最终输出类似如下的数据:
找到问题,针对性的优化即可.对于MOBA项目而言,逻辑层的开销大头一般在技能/AI上.
除了以上分析的手段外,还可能存在有性能问题但是分析不到的情况.比如UI/声音等第三方模块.这时候只能通过屏蔽相关功能做性能对比才能精准的找到性能问题模块.
在我们项目中,就出现过因为加入过多的环境音导致降帧的情况,由于声音播放时单独线程进行的,常规的分析手段都无效.最后通过 对比SVN/屏蔽功能找到了问题.
最后,在做比较大优化的时候,尽量做好单元测试,对优化效果有个大致的预估.越到后期,性能会越敏感,很可能会产生负优化的情况.
每个大的优化项做完后,就做一轮性能测试.如果未达预期,需要review方案/代码并及时纠正.