用Unity自带的Profile排查,卡顿的原因主要在于循环遍历的次数太多。
案例:
遍历格子数太多导致卡顿。
SLG游戏一张大地图由横竖多块“屏”拼接而成,一“屏”又由一片格子组成,一屏包含的格子往往是成百上千。
游戏中有云雾,策划可以通过编辑器刷一片格子,以配置这片云覆盖了哪些格子。
在代码逻辑中,当判断某屏含有哪些云雾是,方法是:遍历9屏,遍历每一屏中的所有格子,看哪些格子含有云雾数据,从而判断该屏含有云雾。
而卡的原因有2个:
1.哪些屏含有云雾,没有预计算,而时间复杂度为9*100*100;
2.逻辑BUG,当某屏中的所有格子都没有云雾数据时,缓存并没有记录下来,所以下次又会实时寻找,做一次9*100*100。
解决方法:
1.预计算,以空间换时间;
2.修改BUG。
遍历资源太多导致卡顿。
SLG地图上包含大量的静态物体(地形/石头/树..)资源,动态加载时,需要遍历一屏上的所有资源然后加载对应预制体。
虽然预制体资源的在家是异步的,但是遍历操作并没有分帧,而遍历的数量已达到几万,这就是卡的原因。
解决方法:
分帧遍历资源,具体用协程在达到一定数量(如100)后yield return即可。