unity中從Resources下讀取較大的資源會卡,有解決辦法么?

有沒有類似AssetBundle的LoadAsync類似方法。也不能在其他Thread里執行unity語句,會把其他的所有腳本都卡住了。


換成非同步載入效果也很有限,因為後台loading結束之後有些操作還是必須在主線程上完成,這部分操作Profiler上面會顯示為Integrate Assets in Background,對象比較複雜或者在低端機型上還是會卡很長時間。

如果是場景比較複雜考慮利用Unity的多場景編輯拆分成多個場景流式載入。如果是比較複雜的Prefab最好拆分一下,然後用腳本延時組裝起來。模型和圖片比較大的話在低端機型上也可能比較卡,可以考慮根據機型選擇不同精度的素材。

同時也要考慮腳本的因素,如果載入的場景或者Prefab上有比較耗時的腳本,最好優化一下,Awake,OnEnable和Start都是在主線程上執行的。

另外官方也不推薦再用Resources保存資源了,Resources下面的資源要在程序啟動時建立索引,複雜度是線性的,scalability不是很好,素材多了會卡,而且也不方便patch,也就比較適合放一些配置文件。正經搞最好都換成AssetBundle,如果要隨app一起分發,可以把AssetBundle放到Streaming Assets裡面用。如果要隨app一起分發還要能更新的話,可以遊戲啟動的時候花點時間把AssetBundle從Streaming Assets裡面導到Cache裡面,性能會好很多。


Unity - Scripting API: Resources.LoadAsync

最近幾個版本才出的API。

個人沒用過不過應該和AssetBundle那個版本差不多。


1,提前載入,在合適的時機,比如Loading界面時。

2,可以試試攜程,不過很大的話估計不解決問題。


這個問題我最近也比較關注,推薦一篇博文:Unity3D佔用內存太大的解決方法

裡面有答案。關鍵點在於:

全面理解Unity載入和內存管理機制之二:進一步深入和細節

Unity幾種動態載入Prefab方式的差異:

其實存在3種載入prefab的方式:

一是靜態引用,建一個public的變數,在Inspector里把prefab拉上去,用的時候instantiate

二是Resource.Load,Load以後instantiate

三是AssetBundle.Load,Load以後instantiate

三種方式有細節差異,前兩種方式,引用對象texture是在instantiate時載入,而assetBundle.Load會把perfab的全部 assets都載入,instantiate時只是生成Clone。所以前兩種方式,除非你提前載入相關引用對象,否則第一次instantiate時會 包含載入引用類assets的操作,導致第一次載入的lag。

更新:

官方論壇有人說Resources.Load和靜態引用是會把所有資源都預先載入的,反覆測試的結果,靜態引用和Resources.Load也是OnDemand的,用到時才會載入。--------------來自上面的博文 通過 @付洋 的指正:這句話只在EDITOR模式下正確. 真機測試Resources.Load確實會預載入依賴項。


1.一些場景中必然會出現的靜態資源資源,例如山水,建築等,預先就部署在場景(Scene)中,以場景為單位進行載入(Scene1,Scene2等)

2.會根據玩家屬性有所變化的動態資源,可以考慮按需載入,比如只載入玩家視界範圍內的資源,或者將地圖劃分為多塊,按照玩家的進度載入,具體實施的時候根據遊戲的業務決定策略。

3.使用LoadAsync本質上並不能很好的解決載入卡頓的問題,但是肯定能有所緩解,能一定程度上降低損失的幀率,但整體上對玩家的體驗未必會更好,所以要看情況使用。

4.預先載入,在loading過程中(如果有的話)預先將一些資源進行init,可以結合第3條進行使用,如果沒有場景loading這一環節,則建議加上


拆分好資源。先載入進入場景玩家先能看到的資源。其它資源按照已後的觸發條件載入


推薦閱讀:

如何評價雲風與xlua作者關於unity,c#,lua的討論,以及他後來給出的方案?
mipmap的優點具體是什麼?
Unity程序員如何轉變為技術美術?現已熟悉UnityShaderlab.?
Unity工作一年能力應該到達什麼水平?
linq 在 Xcode 上編譯錯誤?

TAG:Unity遊戲引擎 |