U3D资源动态加载异步方案探究

准备使用C#的多线程机制进行资源的异步加载,写好了数据结构、同步互斥等,最后发现很恶心的一个限制:

“...\Runtime\ExportGenerated\Editor\BaseClass.cs:1310”

真是相当恶心的一个错误,解释起来就是:

Resources.Load()方法不能在出主线程意外的线程中调用,所以考虑使用C#多线程实现资源后台加载的方案搁浅了(郁闷中)...

经测试,Instantiate()方法和Load()一样,也只能在Main Thread中调用。

PS:U3D自己没提供很好的异步机制(除了AssetBundle,但AssetBundle需要对资源进行打包,我做的是本地化游戏啊大哥-_-|||),却有不让在Background Thread中进行Resources.Load(),真心感觉这是U3D目前版本的一大缺陷。希望后续版本中能够提供诸如Reources.LoadAsync()函数,或者能将Resource.Load()的使用权限分配给非主线程,亦或者将Resources.Load的源代码开放,让我们自己将其修改成异步的...

闲话少叙,妥协了,使用WWW...

关于运行时卡,有2各方面:

(1)资源加载卡,即Resources.Load()卡、WWW.AssetBundle.Load()卡;

(2)实例化过程卡,Instantiate()卡。

 1、资源加载卡

  现象1:在同一场景中(即不进行场景切换),同一个资源,在第一次Load时,会卡,第二次、第三次...第N次加载时不卡;

  现象2:在不同场景(切换不同场景),同一资源在每个场景中第一次加载时都会卡。

    附上一组测试数据:

  测试用例:对由40个特效组成的资源包进行Load()操作。(下标中的时间为加载操作耗时)

    第一次Load  第二次Load  第三次Load

场景1  0.236s    0.0015s    0.0016s

场景2  0.247s    0.0016s    0.0016s

  个人理解:对于同一Scene中的资源,第一次Load时会卡一次,然后第二次、第三次Load时都不会卡,因为Unity3D内部做了缓存。但跳转场景后,再Load同一资源,第一次还是会卡,可能是因为Unity3D底层在跳转场景时会清空Load(加载)资源列表的缓存。

 

原文地址:https://www.cnblogs.com/sifenkesi/p/2443514.html