前段时间,在优化游戏的Loading时长,想利用多线程,把加载任务并发起来,减少整体的耗时。

这个项目使用的是Unity2019,手机上资源使用AssetBunndle加载,优化前整个加载都是用的同步接口,同步加载AB,同步加载AB里Assets。

当我改成异步接口加载Assets时,测试结果居然比使用同步接口还是长,而且长了好几秒。这个结果让我很诧异,异步接口不是多线程的吗,总时间该减少才对啊。

于是进行了Profiler,查看CPU Usage,在Loading的后面一段主线程消耗非常的平稳,能看到很多帧的UpdatePreloading的消耗。而加载线程很早就跑完了任务。

充满了疑惑,还好之前申请源码权限,去分析了源码。

原来异步加载有一部分工作在主线程完成,而这一部分工作,优先级是kBelowNormalPriority,Unity每帧只分配了4ms的时间片,这样做应该是为了保证帧率吧,所以花了很多帧才把全部异步加载的工作完成。

有个例外是如果此时调用了同步加载场景的接口LoadScene,主线程会把所有异步加载已在主线程排队的任务全部完成。利用这个逻辑,可以先进行资源异步加载,再进行场景同步加载,就不用走主线程时间分片了。这样做后,测试结果还是慢,因为不是所有加载任务都在LoadScene之前就排队到主线程了,取决于加载线程的执行速度。

所以从这里得出的结论是,使用异步接口并不能减少Loading时长,反而会更久,异步接口主要保证主线程帧率不受影响,所以更适合在游戏过程中进行异步加载。