Unity載入模組深度解析(網格篇)

weixin_34050427發表於2018-02-21

原文連結:
https://blog.uwa4d.com/archives/LoadingPerformance_Mesh.html

在上一篇 載入模組深度解析(一)中,我們重點討論了紋理資源的載入效能。這次,我們再來為你揭開其他主流資源的載入效率。

這是侑虎科技第53篇原創文章,歡迎轉發分享,未經作者授權請勿轉載。同時如果您有任何獨到的見解或者發現也歡迎聯絡我們,一起探討。(QQ群465082844)


資源載入效能測試程式碼

與上篇所提出的測試程式碼一樣,我們對於其他資源的載入效能分析同樣使用該測試程式碼。我們將每種資源均製作成一定大小的AssetBundle檔案,並逐一通過以下程式碼在不同裝置上進行載入,以期得到不同硬體裝置上的資源載入效能比較。


9378586-a2f42362a7ba210b.jpg

測試環境
引擎版本:Unity 5.2版本
測試裝置:三臺不同檔次的移動裝置(Android:紅米2、紅米Note2和三星S6)


網格資源

網格資源與紋理資源一樣,在載入時同樣會造成較高的CPU佔用,且其載入效率由其自身大小(網格資料量)決定。因此,我們通過選擇不同資料量的網格資源來詳細分析其載入效率。

測試1:不同面片數的網格資源載入效率測試
我們選取了四種不同面片數的網格資源,含有的面片數分別為1K、5K、10K和50K,且不含有Tangent頂點屬性。四組網格資源的記憶體佔用分別為195KB、0.8MB、1.4MB和3.9MB,其對應AssetBundle大小為43KB、108KB、178KB和507KB。

測試網格:


9378586-7fbc9e396ed02798.png

我們在三種不同檔次的機型上載入這些網格資源,為降低偶然性,每臺裝置上重複進行十次載入操作並將取其平均值作為最終效能開銷。具體測試結果如下表所示:

9378586-a98322b8683244d9.png

通過上述測試,我們可以得到以下結論:

1、資源的資料量對載入效能影響較大,面片數越多,其載入越為耗時。裝置效能越差,其耗時差別越為明顯;

2、隨著硬體裝置效能的提升,其載入效率差異越來越不明顯。

測試2:相同面片數、不同頂點屬性的載入效率測試
我們選擇測試1中的網格資源做為該測試的樣本資料,並在打包時加入Tangent頂點屬性。則四組網格資源的記憶體佔用分別為287KB、1.2MB、2.1MB和5.8MB,其對應AssetBundle大小為72KB、228KB、376KB和937KB。與測試1相同,我們在三種不同檔次的機型上重複進行十次載入操作並將取其平均值作為最終效能開銷。具體測試結果如下圖所示:

9378586-3428b9ee58a75690.jpg

9378586-21565c680704eb4f.jpg

通過上述測試,我們可以得到以下結論:

1、頂點屬性的增加對記憶體和AssetBundle包體大小影響較大。與測試1中未引入Tangent頂點屬性的網格資料相比,測試2中的網格資料在記憶體上均大幅度增加(增加量與網格頂點數有關),且AssetBundle大小同樣有成倍(1~2)的增加。

2、頂點屬性增加對於載入效率影響較大,且頂點數越多,影響越大。

注意事項:
模型常見的頂點屬性主要有Position、UV、Normal、Tangent和Color。Color屬性與Tangent屬性一樣,如果網格頂點擁有該屬性,同樣會對記憶體、物理體積和載入效能造成影響。

在使用Draw Call Batching時,切忌將不同屬性的網格模型拼合在一起。舉個例子 ,100個網格模型進行Static Batching,如果99個模型只有Position和UV兩種屬性,而剩下1個模型函式有Position、UV、Normal、Tangent和Color五種屬性。那麼引擎在進行拼合時,會將前99個模型的頂點屬性補齊,然後再進行拼合。這樣無形中會增加大量的記憶體佔用,從而造成不必要的記憶體浪費。

測試3:開啟/關閉Read/Write功能的載入效率測試
我們使用測試1中的網格資源資料,並關閉其Read/Write功能,從而來檢視其Read/Write功能對載入效率的影響。關閉Read/Write功能後,四組網格資源的記憶體佔用分別為104KB、454KB、0.8MB和2.3MB,其對應AssetBundle大小為38KB、94KB、152KB和428KB。與測試1相同,我們在三種不同檔次的機型上重複進行十次載入操作並將取其平均值作為最終效能開銷。具體測試結果如下圖所示:

9378586-22a893a1e95e488e.jpg

9378586-48862ef920eb9ed2.jpg

通過上述測試,我們可以得到以下結論:

1、關閉Read/Write功能會降低AssetBundle的物理大小,其降低量與資源本身資料量相關。同時,關閉Read/Write功能會大幅度降低網格資源的記憶體佔用;

2、關閉Read/Write功能會略微提升該資源的載入效率。


通過以上測試和分析,我們對於網格資源的管理建議如下:

1、在保證視覺效果的前提下,儘可能採用“夠用就好”的原則,即降低網格資源的頂點數量和麵片數量;

2、研發團隊對於頂點屬性的使用需謹慎處理。通過以上分析可以看出,頂點屬性越多,則記憶體佔用越高,載入時間越長;

3、如果在專案執行過程中對網格資源資料不進行讀寫操作(比如Morphing動畫等),那麼建議將Read/Write功能關閉,既可以提升載入效率,又可以大幅度降低記憶體佔用。

正是由於以上載入效率問題,UWA對每個網格資源引數進行了詳細的分析。通過效能測評和資源檢測兩個工具,對專案在Online執行和Offline製作階段進行雙重檢測,從而方便加快速檢視資源的使用情況,定位引發效能問題的具體資源。

針對網格頂點資料的檢測,可以通過以下兩種方式:
1. 通過效能測評報告檢視:

9378586-7b01051b2dcb1775.jpg

2. 通過資源檢測報告檢視:

9378586-13f5eb8a2110def1.jpg

針對網格頂點屬性的檢測,可通過效能測評報告進行檢視:

9378586-3fbce2b6825de67b.jpg

針對網格頂點Read/Write功能的檢測,可通過資源檢測報告進行檢視:

9378586-9b2d11fdff83a330.jpg

說明:以上測試資料為我們所用的測試網格載入資料,需要指出的是,不同網格資源的載入效率會略有相同,因為其數值的不同會造成AssetBundle壓縮包大小的不同,進而造成最終載入效率的不同。同時,需要注意的是,載入方式的不同(一個協程逐資源載入/多協程同時載入),其載入效率也是完全不同的。關於這一點,我們將在後續文章中進行討論。最後,我們後續會進行更多的測試,以期為大家提供更為普遍的測試結果。

以上為網格資源在載入時的效能測試。關於載入模組的效能問題,我們會不斷推出Shader、音訊等其他資源的載入效能分析、資源解除安裝效能分析、資源例項化效能分析、不同載入方式的效能分析等一系列技術文章,並對目前UWA所檢測過專案的共性問題進行總結,以期讓大家對專案的載入效率有更加深入的認知,並提升對載入模組的掌控能力。

相關文章