淺談Unity的資源管理部分

前言

Unity資源管理部分的功能很強大,會幫你做好很多東西,但是由於Unity設計目標是超級通用性,所以很多時候你要更多去了解其原理,才能保證使用的正確性和高效性,否則很容易掉坑裏。

這裏我結合以前看過的Unity4.2的源代碼和部分文檔,淺談下Unity的資源管理部分的一些東西。常言道:“庖丁解牛,恢恢乎”,個人認爲源代碼是唯一沒有二義性的文檔。

3種資源讀取方式

  1. Resources:支持編輯器模式和發佈模式
  2. AssetDatabase :僅僅支持編輯器模式
  3. AssetBundle: 支持編輯器模式和發佈模式

接下來,讓我們看下這3種資源獲取方式的優缺點。

Resources

你可以認爲,unity給你提供了一個特定的包Resources。在編輯器模式下,它以文件夾的形式存在,你可以隨意放置裏邊的散文件。在打包過程中,unity則自動幫你把Resources文件夾的所有東西打包。
優點
開發時絕對的方便。
缺點
Resources文件夾下的任何一點點修改,都會導致Resources包的重打。

AssetDatabase
優點
AssetDatabase 在編輯器模式下超級方便。
缺點
在正式發佈版不能用,要用AssetBundle來替換。

AssetBundle
優點
你可以根據自己的項目實際情況自定義打包粒度,很好的支持熱更新,就連unity 4.0裏被大家吐的最多的槽點——資源依賴問題在unity 5.0以上也被完美的解決了。
缺點
AssetBundle從第一天出生就不是給開發環境用的,如果要修改貼圖,每一張都得打包再測試。(信不信憤怒的美術同學過來找你,呵呵。)

3種資源獲取方式的優缺點總結

  1. Resources :適合開發模式,不適合熱更。
  2. AssetDatabase:僅僅支持編輯器模式,在發佈版本要用AssetBundle 取代。
  3. AssetBundle:很好的支持熱更,適合發佈模式,但開發模式千萬別用。

資源讀取異步的支持
unity引擎內部加載異步管理器(C++類: PreloadManager )負責處理所有的異步加載請求(C++類:PreloadLevelOperation,繼承自C++ 類AsyncOperation )。

注意

  1. ResourceRequest 和 AssetBundleRequest 繼承自C#的 AsyncOperation,此 AsyncOperation非彼AsyncOperation也。
  2. C#的 AsyncOperation和 C++ 的 AsyncOpera tion名字相同,但這是兩個類,C#的單向關聯C++。

Application.backgroundLoadingPriority 就是操作的 PreloadManager。(網絡上有些文章說unity的異步機制是僞多線程,這是不實的。)PreloadManager的確是多線程的。

建議

包裝下unity的異步操作,用一個優先級桶排隊來push引擎異步指令。
每次按照優先級從上述的指令桶中pop,1個或幾個指令,按照指令創建AsyncOperation給引擎,當這些AsyncOperation都執行完,再重複操作。這樣既可以抑制創建AsyncOperation風暴,又可以做到自定義優先級。

不建議

不要短時間push給unity太多的異步操作,這樣會加重unity的負擔,同時也不利於我們控制資源的加載優先級。

更多unity2018的功能介紹請到paws3d爪爪學院查找。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章