准備使用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(加載)資源列表的緩存。
