|
就是到了2020年,加载仍然是unity的硬伤,也可能是大多数引擎的硬伤吧.因为要保证稳定性,所以限制了不能在子线程中执行这些过程.即使是LoadAsync异步加载,也只是从硬盘中读到内存时是异步的.其他的仍然是同步的.
我也针对这个问题去仔细看过profiler,LoadAsync或者Load实际上并不是消耗时间最多的过程,Instantiate才是消耗大户.实例化会调用预设中所有的Awake和Start(可能不太准确,对于未启用的物体,可能没有调用这两个或者只调用了一个,其实无所谓了,我也不关心.我也几乎不写这两个函数.)如果是自己写的Awake和Start还好说.但是要命的是内置组件的Awake和Start,尤其是粒子系统.这才是消耗时间最多的部分.而且最重要的是实例化是无法异步执行的.即使使用了await和async,那也只是将这个过程延后到了下一次的FixedUpdate,仍然是一帧就会执行完毕.
真的要搞定这个,一般也都是用一些歪门邪道的办法.比如分块加载,延迟加载,预加载.不过实际上都只是杯水车薪.目前我也没有找到一个比较好的办法来处理这种加载时的卡顿.
所以有时候我也会感叹,这种大型商业引擎在某些方面实际上还不如自己写的引擎.自己写的好歹还是完美支持多线程异步加载,但是商业引擎却因为兼容性和稳定性而牺牲了诸多功能 .
多线程仍然是unity最遗憾的地方.限制太多了.
至于协程,那种东西实际上在我看来除了代码结构跟普通代码不一样以外,没有实质性的区别,都是在主线程执行的而已. |
|