Unity Android 5.6版本Resources.Load效率的問題


0x00 前言

相信不少使用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個版本下文再說。

屏幕快照 2018-02-04 上午9.58.33.png

這個場景比較簡單,主要是在Resources文件夾下創建了一個有很多(650+)子節點的prefab,並且在運行時通過點擊按鈕調用Resources.Load進行資源加載。

而我的測試設備則是幾年前的MI Note Pro。

0x01 測試

測試場景和測試設備都准備就緒了,接下來我們就直接在Unity5.6.1f1上進行安卓包的構建吧,同時直接連上profiler進行數據抓取。
屏幕快照 2018-02-04 上午8.53.10.png
不過這一測不要緊,果然可以發現這個版本的Unity在調用Resources.Load加載資源的效率很低。大概要耗時1700ms!

等等,冷靜一下,回想一下既然是加載Resources文件夾內的資源,那么Resources文件夾有什么特點嗎?對,它會隨工程一同打包。也就是說在打包的過程中它會經過aapt這個工具的處理啊。那么aapt是什么呢?看它的全稱——Android Asset Packaging Tool,安卓資源打包工具啊。那么能否通過修改aapt的參數來改善加載Resources文件夾內的資源效率的問題呢?

想到這里,嚇得我立馬導出了一個gradle工程。
打開build.gradle文件查看一下,嗯這里沒有設置aapt的相關參數。
屏幕快照 2018-02-04 上午10.18.42.png

所以我來手動加上對aapt的設置吧:

aaptOptions {
	noCompress '.unity3d', '.ress', '.resource', '.obb'
}

ok,這次我們通過Android Studio來導出一個安卓包。並且連上設備進行測試。
no_compress.png

結果讓人稍感欣慰,耗時已經從之前的1700ms來到了300ms。

所以,修改aapt的壓縮策略對Resources文件夾內的資源是有效果。

好了,我們接下來使用另一個Unity版本——5.6.4p1來進行測試。
這次不導出gradle工程,直接使用Unity來打包。

屏幕快照 2018-02-04 上午8.59.15.png

wow~測試的結果亮瞎雙眼。竟然只需要50ms!(考慮到我的測試場景很凶殘,設備很簡陋,從1700+ms來到50ms還是很大的躍升吧)。

這是為什么呢?

答案很簡單,因為我們fix了這個問題啊。而這也是我選擇這個版本進行測試的原因啊。
屏幕快照 2018-02-04 上午10.26.16.png

所以,如果還在對江湖傳聞中5.6版本的Resources.Load效率變態的低感到恐懼的話,就趕快升級Unity版本吧。當然,作為最佳實踐之一,盡量減少使用Resources也是不錯的選擇。

-EOF-
最后打個廣告,歡迎支持我的書《Unity 3D腳本編程》

歡迎大家關注我的公眾號慕容的游戲編程:chenjd01


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM