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

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

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

資源載入性能測試代碼

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

測試環境

引擎版本: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。

測試網格:

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

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

1、資源的數據量對載入性能影響較大,面片數越多,其載入越為耗時。設備性能越差,其耗時差別越為明顯;

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

測試2:相同面片數、不同頂點屬性的載入效率測試

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

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

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相同,我們在三種不同檔次的機型上重複進行十次載入操作並將取其平均值作為最終性能開銷。具體測試結果如下圖所示:

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

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

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

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

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

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

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

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

針對網格頂點數據的檢測,可以通過以下兩種方式:

1. 通過性能測評報告查看:

2. 通過資源檢測報告查看:

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

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

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

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


推薦閱讀:

ET框架:windows/Linux 雲伺服器部署
棋盤格與幻影坦克
一口氣解決RenderQueue、Ztest、Zwrite、AlphaTest、AlphaBlend和Stencil
關於Unity動畫系統優化,你可能遇到這些問題

TAG:Unity游戏引擎 | 性能优化 | 手机游戏开发 |