这是一次CPU卡顿的排查实践,开发环境是Unity5.3.4p5 + uGUI
======
为了避免打log引起的额外消耗,所以以下分析基于log关闭后的Profiler数据
Debug.logger.logEnabled =false;
问题1:ConfigUtil.Get().Single(Func)
List ConfigUtil.Get()内含List.AddRange()申请临时内存,相对GC Alloc和耗时较多;
T List.Single(Func)多次遍历查找同一个List,耗时较多。影响范围较广。
修行状态的红点计算NinjaPracticeController.UpdatePracticeState()较为复杂,查询修行配置有多层循环嵌套,而且内层嵌套有多次重复计算,且频繁出现于回包中。比如心跳回包会计算修行红点状态,其他一些回包触发OnSyncSthChangeCommand的也会引起修行红点计算。
修改前(60次+60次):
将查询全量配置提前到for循环之前算好。并且classEvolveCfg和classUpgradeCfg这两项配置信息并不总是需要,而是根据底下if-else的条件局部需要,所以挪到实际需要的地方才计算。
修改后(40次+3次):
Single方法的调用还可以进一步优化(配置List转换为Map,然后for循环内按Key查找)。
更新忍者状态的NinjaController.UpdateNinjaState也有类似的现象:
初次加载忍者技能、忍者课程修炼也是如此:
其他模块的List ConfigUtil.Get()调用,建议按需修改。
问题2:MaouOutline的数组重置操作
为达到更佳的描边效果,重写了ModifyMesh/ModifyVertices的实现ÿ