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

2022-01-29 慕容的遊戲編程
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個版本下文再說。

這個場景比較簡單,主要是在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也是不錯的選擇。

相關焦點

  • Unity Android Plugin開發指南
    最後,工程的結構類似這樣:Assets└── Plugins    ├── Android    │   ├── AndroidManifest.xml    │   ├── android_sdk.jar    │   └── res    │       ├── values    │       └── drawable    └── unity_wrapper.dll
  • 提高效率必備神器 ---- Android Studio模板詳解
    所以為了效率和安全起見,我們需要把工程目錄模板進行修改,達到創建 project 時就可以生成完整的目錄結構,不再手動去創建的目的。><resources></resources>(二) 這裡有3個需要變更的地方。(1)新建module時,自動添加v4依賴,並且指定v4,v7包依賴版本。(2)新建module時自動生成不同解析度的drawable文件夾。(3)指定dimens.xml的路徑。
  • Android Studio 4.1 發布啦
    已知問題和解決方法Android Studio 4.1中的本機內存探查器不適用於Android 11設備,4.2預覽版本中當前提供了對Android 11設備配置文件的支持。從最初的4.1版本開始已禁用應用程式啟動分析,未來在即將發布的版本中將啟用此選項。解決方法是,可以使用 Perfetto 獨立命令行分析器來捕獲啟動配置文件。
  • Android Studio 3.5: 穩步推進 Project Marble 計劃
    感謝大家向我們提交錯誤報告,並在多個社交平臺上與團隊進行積極互動,特別是 Android 社區中的 40 位外部貢獻者,非常感謝他們一直以來的熱心奉獻,幫助團隊提交和解決 Android Studio 3.5 中的重要質量問題。
  • 如何理解Linux中的load averages?
    0.0,說明系統處於空閒狀態如果 1 分鐘的平均值大於 5 分鐘或者 15 分鐘,說明系統負載正在增加如果 1 分鐘的平均值小於 5 分鐘或者 15 分鐘,說明系統負載正在減小如果這些值大於 CPU 的核數,說明可能遇到了性能問題利用這三個值,我們可以判斷系統的負載是在增加還是在減小,這在實踐中很有用。
  • Android用戶態啟動流程分析
    void property_load_boot_defaults() { if (!lo前者的順序如下:void load_system_props() { load_properties_from_file("/system/build.prop", NULL); load_properties_from_file("/odm/build.prop", NULL); load_properties_from_file
  • Android 10 開發者常見問題
    如果您有更具體的問題,請聯繫您的加固或熱修複方案供應商。Q 3: MAC 地址隨機之後,如果路由器設置了 MAC 地址白名單,手機就無法連接上路由器了,這個問題怎麼解決?A: 系統知道真實的 MAC 地址,只是不會報告給應用。
  • Unity圖片資源處理
    Max Size: 最大大小,超出後進行整體有損採樣Format:compressed/16bits/TrueColor,具體採用什麼格式視乎當前圖片和平臺決定。u683C%u5F0F%uFF0C%u56FE%u7247%u538B%u7F29%u683C%u5F0F%u9700%u8981%u786C%u4EF6%u7684%u652F%u6301%uFF0C%u76EE%u524D%20android%20%u5E73%u53F0%u666E%u904D%u652F%u6301%u7684%u662F%20ETC1%20%u538B%u7F29%uFF0C
  • Android 動態修改Linker實現LD_PRELOAD PLT Hook
    pipeFd 手機SDK版本 android.app.ActivityThread seq=數字其中 android.app.ActivityThread seq=數字 是啟動 Apk 傳遞過來的參數args,回過頭來方式 2 使用exec構造該執行參數即可。
  • Unity高級知識點總結:性能優化與圖形渲染進階
    5、玩家頭頂血條的HUD要使用3D的,而不是UGUI。否則同屏玩家數量很多的時候Mesh合併開銷很大。6、UI上使用TextMeshPro。可以很大程度上緩解UI打開卡頓的問題。描邊、陰影開銷很低。7、控制幀率。現在高刷新率的手機非常多。不要直接使用VSyncCount控制幀率了。
  • Android Studio 3.6穩定版發布
    Android Studio 3.6 穩定版已發布,此版本也是「Project Marble」結束後發布的首個版本,「Project Marble
  • Android的so加載過程了解一下?
    = nullptr) { const android_dlextinfo dlextinfo = { .flags = ANDROID_DLEXT_USE_NAMESPACE, .library_namespace = boot_namespace, }; void* handle = android_dlopen_ext
  • Android 11 適配中遇到的問題及解決辦法
    應谷歌應用商店要求,自11月1日起,所有上傳到谷歌應用商店的應用將被強制要求升級目標 API 版本到 30。這裡記錄我升級目標版本到 30 的過程中遇到的問題。1.1 問題詳情一般來說,這種 API 級別的變更不會被記錄到官方的文檔中,但是,遇到了就是坑。
  • 【谷歌】終於來了:Android 5.0正式開啟,OTA更新開始推送
    Android 5.0序幕已經開啟。目前已經發布的包括Nexus 9、Nexus 5、Nexus 7 2012/2013 Wi-Fi、Nexus 10、Nexus Player等設備,Nexus 7 2012/2013 LTE版本的暫無,最無法理解的是同樣新款的Nexus 6也暫缺,不知為何。
  • Android中SettingsProvider源碼解析
    在 Android 6.0 版本時,SettingsProvider 被重構,Android 從性能、安全等方面考慮,把SettingsProvider 中原本保存在 settings.db 中的數據,目前全部保存在 XML 文件中。
  • Android破解實戰:遊戲蜂窩3.19版本破解記錄
    adbpush android_server /data/local/tmp/adbshell chmod 777 /data/local/tmp/android_serversu /data/local/tmp/android_serveradb forward tcp:23946
  • 還在用 android.support?谷歌強推 AndroidX 啦!
    AndroidX 會將原始支持庫 API 軟體包映射到 androidx 命名空間。只有軟體包和 Maven 工件名稱發生了變化;類、方法和欄位名稱沒有改變。與支持庫不同,AndroidX 軟體包會單獨維護和更新。androidx 軟體包使用嚴格的語義版本控制,從版本 1.0.0 開始,可以單獨更新項目中的 AndroidX 庫。
  • Android模擬器之Genymotion
    之前已經介紹了android原生自帶的模擬器,它的運行速度確實很慢,不管是對開發還是測試同學來說,速度慢肯定會影響工作的效率,今天介紹
  • Unity URP/SRP 渲染管線淺入深出【匠】
    代碼膿腫,效果效率無法做到最佳:內置渲染管線在一個渲染管線裡面支持所有的二十多個平臺,包括非常高端的PC平臺,也包括非常低端的平臺,很老的手機也要支持,所以代碼越來越濃腫,很難做到使效率和效果做到最佳。目的:
  • 漫步VR——Unity語音聊天室開發
    Unity5.1版本後全力支持VR開發,所以最好下載5.1版本以後的版本。安裝過程是一鍵式安裝。編譯Support包:unity可以很方便移植到多個平臺上,依賴的即是下載安裝對應unity版本的Support-for-Editor。