最近給項目改造AssetBundle系統,又從新摸起了AssetBundle這塊兒。。
由於如今使用4.x版本的狀況已經愈來愈少,而在5裏面unity3d已經原生支持了依賴分析增量構建等重量級功能,因此我就再也不浪費篇幅去講系統設計相關的話題。
我花了一些時間作了一些小實驗,能夠明確一些unity3d在AssetBundle上的處理細節。但願看到這篇文章的人可以從中獲取一些養分。網絡
問:當使用WWW加載AssetBundle時,WWW.Dispose()和AssetBundle.Unload(false)兩個釋放操做分別會如何影響內存?
答:單獨調用WWW.Dispose會釋放掉一部份內存(並不知道是什麼內存,猜想是和網絡相關的部分);單獨調用AssetBundle.Unload不會帶來任何內存變化;同時調用這兩個接口能夠徹底釋放內存。spa
實驗過程:
打包9個AssetBundle,每一個Bundle中有一張2048x2048的RGBA32格式紋理(16MB)。
使用Profiler和任務管理器觀察內存變化。
設計
問:重複從同一個AssetBundle中加載資源,會帶來怎樣的內存變化?
答:只會在CPU端佔用一分內存,但在GPU部分,每次加載都會額外佔用一分內存。3d
實驗過程:
打包一張2048x2048的RGBA32格式紋理(16MB)爲AssetBundle。
反覆進行"加載,取得ResourceObject,卸載Bundle"的操做,使用Profiler觀察內存變化。
其中,來自Unity的16MB增加是什麼呢?從Profiler Detailed裏能夠看到具體項目。
一個叫作GfxClientDevice的項目從8.0MB提高到了24.0MB。
至於這個GfxClientDevice項目究竟是什麼呢? 我往後再調查補充。。。。blog
問:若是我打包Bundle和運行並不在一個AssetBundle中,能夠正確的加載資源嗎?
答:能夠。接口
問:若是我把Shader隨着Bundle一塊兒打包出來,而運行的工程並無這個Shader,那麼Shader能夠正常運做嗎?
答:能夠。圖片
問:若是兩個Bundle都包含一樣的資源(未處理共享依賴),加載Bundle的時候unity3d如何處理引用?
答:會各自加載本身包裏的資源。內存
問:在兩次不相干的打包過程當中,依賴是否能夠有效的保持。
答:若是使用Deterministic參數,則能夠保持。反之則不能,須要從新打包全部相關Bundle。資源
實驗過程: 有資源A,B,C,其中資源B和資源C都依賴於A。每一個資源打一個Bundle。it
不開啓Deterministic。先帶依賴打包A和B,不包含C。而後從新帶依賴打包A和C,不包含B。在運行時B會丟失對A的引用。
開啓Deterministic。同上流程,在運行時B依然能夠保持對A的引用。