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