最近运营组提了优化建议,说进入游戏时感觉很卡顿,进入游戏的整个loading过程中会出现3次明显的卡顿,不顺畅,体验很不舒服,同时找了几个竞品游戏做对比,发现我们的游戏确实加载体验不好,遂开始着手分析是哪里出了问题.

  • 1.第一直觉是美术资源加载的问题,资源加载是卡主线程的,肯定会出现画面卡顿.于是我从启动函数开始梳理,直到卡顿的地方,发现还没到加载美术资源的地方就已经卡了,继续
  • 2.发现运行第一个lua脚本的地方会出现明显卡顿,于是开始分析这个lua脚本做了什么逻辑,一行一行进行注释,调试,最后只剩一个空表了,发现还是卡,继续
  • 3.发现在第一个lua脚本运行之前会加载所有的lua bundle文件,这一步会导致主线程卡住1~2秒的时间,到这里算是找到了第1个卡顿的原因
  • 4.继续排查,找到了第2个卡顿的原因,在游戏加载的过程中会对多语言,游戏配置文件等大量的lua文件进行require,这一步也会卡住主线程1秒左右.
  • 5.最后一次卡顿是出现在美术资源预加载的地方,比如大地图,主界面UI等

至此,3处卡顿的点和原因都已经知道了,接下来就是分析解决方案了.

通过对竞品游戏的分析,发现我们游戏启动时的splash闪屏时间比它们要短很多,尤其在ios上,几乎是一闪而过,而竞品游戏会在splash界面停留2~3秒的时间,难道它们是在这里处理上述卡点的?很有可能,于是我调整了加载lua bundle资源,lua require,预加载美术资源的触发点,由原来的分布式执行统一改到场景初始化中去,目前unity对splash界面的显示原理取决于启动场景的初始化时间,启动场景什么时候初始化完毕,splash什么时候消失,只要能保证在初始化场景时阻塞调用上述三个卡点逻辑,就能保证在splash消失时所有耗时的逻辑已经执行完毕了.

unity android14 手机运行卡死 AndroidManifest配置 unity运行特别卡_游戏开发

优点:splash消失后,从loading界面开始到看到主城,都比较顺畅,对于玩家来说体验很舒服
缺点:splash的时间变长了

目前优化后,从运营和玩家那里得到的反馈都是正向的.

我们项目是基于tolua的,在游戏启动时即加载lua bundle和lua require跨过了热更流程,有点违背热更的设计意图,因此目前我们的解决方案是:

  • 1.在启动游戏时第一时间加载lua bundle和lua require
  • 2.如果有触发热更,则在热更完毕后重新加载一次启动场景,同时重启lua虚拟机,通过这次重启机制,重新再加载一次更新后的lua bunlde和 lua require

相对于原来热更完毕可以直接进入游戏的方案,现在的方案会多一次重载,不过考虑到正常进入游戏和触发热更后进入游戏的几率占比,目前的方案是完全可以接受的.