准备使用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(加载)资源列表的缓存。