Unity教程之-Unity3d移动平台性能优化专题(11):脚本优化

 

上篇文章《Unity教程之-Unity3d移动平台性能优化专题(十):大量物体的处理》,本篇文章我们继续探讨优化策略:脚本优化!

最近一直忙于逻辑,就一段时间没管性能,然后放到红米上,突然一开始有严重卡顿。情况如下:

以前所有战斗初始化都是在Awake()里面执行,全部时间大概是1-2s,但由于是在awake中,从体验上会觉得是和loading一块,所以没有影 响。但现在增加了一个剧情,一开始设计的时候很简单,就是说剧情模式下执行剧情脚本,然后进入战斗再挂上战斗脚本。然后问题来了,我希望做到剧情和战斗的 无缝衔接,起码不要有明显的卡顿,不然剧情结束还要loading啥的太sb了。但现在的情况是,所有战斗脚本Awake有2s左右,基本就卡主了。性能 分析器也显示主要是资源加载和第一次初始化太耗时间。我主要从三个方面入手处理。

1.将可以提前准备的资源依然放在Awake中。这个就是从逻辑上处理,本来要剧情结束才开始战斗,但其实一开始就可以准备全部的剧情资源和部分战斗资 源,例如战斗场景,背景音乐等。这个需要重构,我也鼓励大家多重构,不要怕麻烦。因为这样才能进步。这一步做完,基本少了一点点卡顿,大概还是接近2s。

2.排队初始化。战斗单元是无法提前得知的,所以无法提前准备,然后我一开始是同时初始化10个战斗单位,现在改成每隔0.05秒初始化一个,也就 0.5s初始化完毕。一开始觉得这样肯定大幅减少卡顿,万万没想到竟然还是有1s多一点,我就纳闷了。还好有性能分析器,我仔细看了看,只有第一个是占了 0.5s。我想了下,应该是JIT的问题,还好以前碰到过,就特地留了一个接口,用来预先执行。所以采用第3招:

3.解决JIT,关于JIT大家请自己百度。我就不解释了,解决方案也比较麻烦,因为u3d中是无法使用预先编译的方法的,只能手动调用, 但手动调用又要保证逻辑不出错,需要专门写一种兼容性良好的代码,不过效果也很出众,现在基本就0.5s以内的卡顿,比红米好的基本都没啥压力。

好了,本篇unity3d关于优化的教程到此结束,下篇我们再会!