相信很多使用Unity的小夥伴都據說過,甚至也親身經歷過在Unity5.6最初的幾個版本中使用Resources.Load方法加載資源變~~慢的問題。
這個問題的確是存在的,好比這個issue中提到的:
android-performance-regression-when-loading-a-prefab-with-a-lot-of-child-objects-using-resources-dot-loadhtml
因此爲了驗證問題並思考是否有解決方案,我也實現了相似這個issue中提到的測試場景,而且分別在Unity5.6.1f1版本和Unity5.6.4p1版本上進行了測試對比,至於爲什麼選擇這2個版本下文再說。android
這個場景比較簡單,主要是在Resources文件夾下建立了一個有不少(650+)子節點的prefab,而且在運行時經過點擊按鈕調用Resources.Load進行資源加載。編程
而個人測試設備則是幾年前的MI Note Pro。工具
測試場景和測試設備都準備就緒了,接下來咱們就直接在Unity5.6.1f1上進行安卓包的構建吧,同時直接連上profiler進行數據抓取。
不過這一測沒關係,果真能夠發現這個版本的Unity在調用Resources.Load加載資源的效率很低。大概要耗時1700ms!測試
等等,冷靜一下,回想一下既然是加載Resources文件夾內的資源,那麼Resources文件夾有什麼特色嗎?對,它會隨工程一同打包。也就是說在打包的過程當中它會通過aapt這個工具的處理啊。那麼aapt是什麼呢?看它的全稱——Android Asset Packaging Tool,安卓資源打包工具啊。那麼可否經過修改aapt的參數來改善加載Resources文件夾內的資源效率的問題呢?gradle
想到這裏,嚇得我立馬導出了一個gradle工程。
打開build.gradle文件查看一下,嗯這裏沒有設置aapt的相關參數。
ui
因此我來手動加上對aapt的設置吧:3d
aaptOptions { noCompress '.unity3d', '.ress', '.resource', '.obb' }
ok,此次咱們經過Android Studio來導出一個安卓包。而且連上設備進行測試。
code
結果讓人稍感欣慰,耗時已經從以前的1700ms來到了300ms。orm
因此,修改aapt的壓縮策略對Resources文件夾內的資源是有效果。
好了,咱們接下來使用另外一個Unity版本——5.6.4p1來進行測試。
此次不導出gradle工程,直接使用Unity來打包。
wow~測試的結果亮瞎雙眼。居然只須要50ms!(考慮到個人測試場景很兇殘,設備很簡陋,從1700+ms來到50ms仍是很大的躍升吧)。
這是爲何呢?
答案很簡單,由於咱們fix了這個問題啊。而這也是我選擇這個版本進行測試的緣由啊。
因此,若是還在對江湖傳聞中5.6版本的Resources.Load效率變態的低感到恐懼的話,就趕快升級Unity版本吧。固然,做爲最佳實踐之一,儘可能減小使用Resources也是不錯的選擇。
-EOF-
最後打個廣告,歡迎支持個人書《Unity 3D腳本編程》
歡迎你們關注個人公衆號慕容的遊戲編程:chenjd01