1. 程式人生 > >Unity載入模組深度解析之紋理篇

Unity載入模組深度解析之紋理篇

在遊戲和VR專案的研發過程中,載入模組所帶來的效率開銷和記憶體佔用(即“載入效率”、“場景切換速度”等)經常是開發團隊非常頭疼的問題,它不僅包括資源的載入耗時,同時也包含場景物件的例項化和資源解除安裝等。在我們看來,該模組的耗時是目前引擎中僅次於渲染的第二大模組。因此,我們認為非常有必要來跟大家分享一下目前載入模組的主要效能問題。

我們通過對提交到www.uwa4d.com網站的大量專案進行分析,認為目前載入模組中最為耗時的效能開銷可以歸結為以下幾類:資源載入、資源解除安裝、Object的例項化和程式碼的序列化等。今天,我們先為大家帶來資源載入中紋理資源的載入效能分析。

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

資源載入

資源載入是載入模組中最為耗時的部分,其CPU開銷在Unity引擎中主要體現在Loading.UpdatePreloading和Loading.ReadObject兩項中,相信經常檢視Profiler的朋友對這兩項肯定毫不陌生了。

Loading.UpdatePreloading,這一項僅在呼叫類似LoadLevel(Async)的介面處出現,主要負責解除安裝當前場景的資源,並且載入下一場景中的相關資源和序列化資訊等。下一場景中,自身所擁有的GameObject和資源越多,其載入開銷越大。

在很多專案中,存在另外一種載入方式,即場景為空場景,絕大部分資源和GameObject都是通過OnLevelWasLoaded回撥函式中進行載入、例項化和拼合的。對於這種情況,Loading.UpdatePreloading的載入開銷會很小。

Loading.ReadObject,這一項記錄的則是資源載入時的真正資源讀取效能開銷,基本上引擎的主流資源(紋理資源、網格資源、動畫片段等等)讀取均是通過該項來進行體現。可以說,這一項很大程度上決定了專案場景的切換效率。正因如此,我們就當前專案中所用的主流資源進行了大量的測試和分析,下面我們將分析結果與大家一起分享,希望可以幫到正在進行開發的你。

注意事項:本篇文章的資源效能分析主要是針對移動專案而言,因為目前UWA所測評的專案中,移動遊戲/應用佔比在90%以上。所以,我們選擇首先在移動裝置上針對每種資源的載入效能進行分析和總結。

資源載入效能測試程式碼

以下為我們測試時所使用的測試程式碼,我們將每種資源均製作成一定大小的AssetBundle檔案,並逐一通過以下程式碼在不同裝置上進行載入,以期得到不同硬體裝置上的資源載入效能比較。
請輸入圖片描述

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

紋理資源

紋理資源是專案載入過程中開銷佔用最大的資源之一,其載入效率由其自身大小決定。目前,決定紋理資源大小的因素主要有三種:解析度、格式和Mipmap是否開啟。

1. 解析度 & 格式
解析度和格式是影響紋理資源載入效率的重要因素,因為這兩項的設定對紋理資源的大小影響很大。因此,我們對這兩種因素進行了詳細的測試:

測試1:相同格式、不同解析度的載入效率測試
我們選取了兩張解析度為2048x2048的普通紋理資源,並在打成AssetBundle時,將其解析度最大值分別設定為512x512、1024x1024和2048x20248,紋理格式均設定為ETC1(Android)和PVRTC(iOS)、且關閉Mipmap功能。所以,三組紋理的記憶體佔用分別為256KB、1MB和4MB,其對應AssetBundle大小為156KB、531KB和1.92MB(對於Android平臺)、175KB、628KB和2.4MB(對於iOS平臺)。Unity 版本為5.2,壓縮格式為預設的LZMA壓縮。

Android平臺測試紋理:
請輸入圖片描述

我們在五種不同檔次的機型上載入這些紋理資源,為降低偶然性,每臺裝置上重複進行十次載入操作並將取其平均值作為最終效能開銷。具體測試結果如下表所示。
請輸入圖片描述
通過上述測試,我們可以得到以下結論:

1、紋理資源的解析度對載入效能影響較大,解析度越高,其載入越為耗時。裝置效能越差,其耗時差別越為明顯;

2、裝置越好,載入效率確實越高。但是,對於硬體支援紋理(ETC1/PVRTC)來說,中高階裝置的載入效率差別已經很小,比如圖中的紅米Note2和三星S6裝置,差別已經很不明顯。

測試2:不同格式、相同解析度的載入效率測試
我們選取了兩張解析度為1024x1024的普通紋理資源,並在打成AssetBundle時,根據不同平臺將其紋理格式分別設定不同格式用於打包。對於Android平臺,我們使用ETC1、ETC2、RGBA16和RGBA32四種格式,對於iOS平臺,我們使用PVRTC 4BPP、RGBA16和RGBA32三種格式,同時,對於每張紋理均關閉Mipmap功能。所以,三組紋理的記憶體佔用分別為1MB、1MB、4MB 和 8MB(Android平臺)/1MB、4MB 和 8MB(iOS平臺)。

Android平臺測試紋理:
請輸入圖片描述
與測試1相同,我們在五種不同檔次的機型上重複進行十次載入操作並將取其平均值作為最終效能開銷。具體測試結果如下圖所示。
Android裝置:
請輸入圖片描述
iOS裝置:
請輸入圖片描述
通過上述測試,我們可以得到以下結論:

1、紋理資源的格式對載入效能影響同樣較大,Android平臺上,ETC1和ETC2的載入效率最高。同樣,iOS平臺上,PVRTC 4BPP的載入效率最高。

2、RGBA16格式紋理的載入效率同樣很高,與RGBA32格式相比,其載入效率與ETC1/PVRTC非常接近,並且裝置越好,載入開銷差別越不明顯;

3、RGBA32格式紋理的載入效率受硬體裝置的效能影響較大,ETC/PVRTC/RGBA16受硬體裝置的影響較低。

注意事項:這裡需要指出的是測試中所使用的ETC1和ETC2紋理均為RGB 4Bit格式,所以對於半透明紋理貼圖,需要兩張ETC1格式的紋理進行支援(一張RGB通道,一張Alpha通道)。逐一載入兩張ETC1格式的紋理,其載入效率要低於RGBA16格式,但可以通過載入方式來進行彌補。這一點我們將在後續文章中進行詳細說明。

2. 開啟Mipmap功能

開啟Mipmap功能同樣會增大一部分紋理大小,一般來說,其記憶體會增加至原始大小的1.33倍。因此,我們對開啟Mipmap功能前後的載入效能進行了詳細的測試:

測試3:開啟/關閉Mipmap功能的載入效率測試
我們仍然使用兩張解析度為1024x1024的普通紋理資源,分別使用ETC1格式、PVRTC格式、RGBA16格式和RGBA32格式(測試所用紋理與測試2相同),並在打成AssetBundle時,一組開啟Mipmap功能,一組關閉Mipmap功能。

與測試1相同,我們在五種不同檔次的機型上重複進行十次載入操作並將取其平均值作為最終效能開銷。具體測試結果如下圖所示。
Android平臺:
請輸入圖片描述
請輸入圖片描述
iOS平臺:
請輸入圖片描述
請輸入圖片描述
通過上述測試,我們可以看出:開啟Mipmap功能會導致資源載入更為耗時,且裝置效能越差,其載入效率影響越大。

通過以上效能測試,我們對於紋理資源的載入建議如下:

1、嚴格控制RGBA32和ARGB32紋理的使用,在保證視覺效果的前提下,儘可能採用“夠用就好”的原則,降低紋理資源的解析度,以及使用硬體支援的紋理格式。

2、在硬體格式(ETC、PVRTC)無法滿足視覺效果時,RGBA16格式是一種較為理想的折中選擇,既可以增加視覺效果,又可以保持較低的載入耗時。

3、嚴格檢查紋理資源的Mipmap功能,特別注意UI紋理的Mipmap是否開啟。在UWA測評過的專案中,有不少專案的UI紋理均開啟了Mipmap功能,不僅造成了記憶體佔用上的浪費,同時也增加了不小的載入時間。

4、ETC2對於支援OpenGL ES3.0的Android移動裝置來說,是一個很好的處理半透明的紋理格式。但是,如果你的遊戲需要在大量OpenGL ES2.0的裝置上進行執行,那麼我們不建議使用ETC2格式紋理。因為不僅會造成大量的記憶體佔用(ETC2轉成RGBA32),同時也增加一定的載入時間。下圖為測試2中所用的測試紋理在三星S3和S4裝置上載入效能表現。可以看出,在OpenGL ES2.0裝置上,ETC2格式紋理的載入要明顯高於ETC1格式,且略高於RGBA16格式紋理。因此,建議研發團隊在專案中謹慎使用ETC2格式紋理。
請輸入圖片描述

正是由於以上載入效率問題,我們在UWA測評報告中加入了對每個檢測到的紋理資源引數的詳細展示,以方便開發團隊可以快速檢視資源的使用情況,只需對相關資訊列進行排序,即可定位引發效能問題的具體資源。

請輸入圖片描述

說明:以上測試資料為我們所用的測試紋理載入資料,需要指出的是,不同紋理的載入效率是不相同的,因為其內容的不同會造成AssetBundle壓縮包大小的不同,進而造成最終載入效率的不同。這裡我們給出的具體效能比較,其本意是讓大家通過資料直觀瞭解到紋理格式、解析度和Mipmap功能對載入效能的影響。另外,我們後續會進行更多的測試,以期為大家提供更為普遍的測試結果。

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