本文首发公众号洪流学堂。洪流学堂,让你快人几步。
从Addressables 1.17.4-preview版本开始,加入了一个新的API,叫做WaitForCompletion()
可以用于将异步操作变为同步操作。
支持的Unity版本为:Unity 2019 LTS、Unity 2020 LTS和Unity 2021.1
之前版本的Addressables中,要么全部异步操作,要么全部同步操作,非常不便。现在这个问题解决了。
具体代码如何写呢:
void Start()
{
//同步加载一个GameObject
var op = Addressables.LoadAssetAsync<GameObject>("myGameObjectKey");
GameObject go = op.WaitForCompletion();
//Do work...(运行……)
Addressables.Release(op);
}
这里面要注意的是,不管是同步操作还是异步,最后都得将操作给释放。Addressables.Release(op);
性能影响
咋大部分情况下,同步加载的性能应该和异步加载差不多,偶尔会出现更快或者更慢的情况。
以下特定情况会慢得多:
第一种是 Addressables 运行涉及大量引擎调用时,常出现在一次加载大量资源或体积庞大、依赖繁多的资源时。速度慢的原因是 Unity 2021.1 在以同步方式运行异步引擎接口时会在每次调用时短暂停顿一下。这种停顿现象已在 2021.2 中移除,引擎目前处于 alpha 测试。
第二种是当 WaitForCompletion 在后台处理大型运算时,再调用其处理小型运算。WaitForCompletion 运算必须在引擎的任务队列中依次完成,如果小型运算的前头有一些大型运算,则只有前边的完成,系统才能完成队列后方的运算。
网友评论