在上一篇 加載模塊深度解析(一)中,我們重點討論了紋理資源的加載性能。這次,我們再來為你揭開其他主流資源的加載效率。
這是侑虎科技第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所檢測過項目的共性問題進行總結,以期讓大家對項目的加載效率有更加深入的認知,並提升對加載模塊的掌控能力。