[Unity優(yōu)化] Unity加載資源深度解析

在游戲和VR項目的研發(fā)過程中闭树,加載模塊所帶來的效率開銷和內(nèi)存占用(即“加載效率”、“場景切換速度”等)經(jīng)常是開發(fā)團隊非常頭疼的問題柬赐,它不僅包括資源的加載耗時凰慈,同時也包含場景物件的實例化和資源卸載等。在我們看來钳榨,該模塊的耗時是目前引擎中僅次于渲染的第二大模塊舰罚。因此,我們認(rèn)為非常有必要來跟大家分享一下目前加載模塊的主要性能問題重绷。

我們通過對提交到www.uwa4d.com網(wǎng)站的大量項目進行分析沸停,認(rèn)為目前加載模塊中最為耗時的性能開銷可以歸結(jié)為以下幾類:資源加載、資源卸載昭卓、Object的實例化和代碼的序列化等。今天瘟滨,我們先為大家?guī)碣Y源加載中紋理資源的加載性能分析候醒。

這是侑虎科技第48篇原創(chuàng)文章,歡迎轉(zhuǎn)發(fā)分享杂瘸,未經(jīng)作者授權(quán)請勿轉(zhuǎn)載倒淫。同時如果您有任何獨到的見解或者發(fā)現(xiàn)也歡迎聯(lián)系我們,一起探討败玉。(QQ群465082844)

資源加載

資源加載是加載模塊中最為耗時的部分敌土,其CPU開銷在Unity引擎中主要體現(xiàn)在Loading.UpdatePreloading和Loading.ReadObject兩項中,相信經(jīng)常查看Profiler的朋友對這兩項肯定毫不陌生了运翼。

Loading.UpdatePreloading返干,這一項僅在調(diào)用類似LoadLevel(Async)的接口處出現(xiàn),主要負(fù)責(zé)卸載當(dāng)前場景的資源血淌,并且加載下一場景中的相關(guān)資源和序列化信息等矩欠。下一場景中,自身所擁有的GameObject和資源越多悠夯,其加載開銷越大癌淮。

在很多項目中,存在另外一種加載方式沦补,即場景為空場景乳蓄,絕大部分資源和GameObject都是通過OnLevelWasLoaded回調(diào)函數(shù)中進行加載、實例化和拼合的夕膀。對于這種情況虚倒,Loading.UpdatePreloading的加載開銷會很小美侦。

Loading.ReadObject,這一項記錄的則是資源加載時的真正資源讀取性能開銷裹刮,基本上引擎的主流資源(紋理資源音榜、網(wǎng)格資源、動畫片段等等)讀取均是通過該項來進行體現(xiàn)捧弃≡穑可以說,這一項很大程度上決定了項目場景的切換效率违霞。正因如此嘴办,我們就當(dāng)前項目中所用的主流資源進行了大量的測試和分析,下面我們將分析結(jié)果與大家一起分享买鸽,希望可以幫到正在進行開發(fā)的你涧郊。

注意事項:本篇文章的資源性能分析主要是針對移動項目而言,因為目前UWA所測評的項目中眼五,移動游戲/應(yīng)用占比在90%以上妆艘。所以,我們選擇首先在移動設(shè)備上針對每種資源的加載性能進行分析和總結(jié)看幼。

資源加載性能測試代碼

以下為我們測試時所使用的測試代碼批旺,我們將每種資源均制作成一定大小的AssetBundle文件,并逐一通過以下代碼在不同設(shè)備上進行加載诵姜,以期得到不同硬件設(shè)備上的資源加載性能比較汽煮。


測試環(huán)境

引擎版本:Unity 5.2版本

測試設(shè)備:五臺不同檔次的移動設(shè)備(Android:紅米2、紅米Note2和三星S6棚唆,iOS:iPhone 5 和 iPhone 6)

紋理資源

紋理資源是項目加載過程中開銷占用最大的資源之一暇赤,其加載效率由其自身大小決定。目前宵凌,決定紋理資源大小的因素主要有三種:分辨率鞋囊、格式和Mipmap是否開啟。

1. 分辨率 & 格式

分辨率和格式是影響紋理資源加載效率的重要因素摆寄,因為這兩項的設(shè)置對紋理資源的大小影響很大失暴。因此,我們對這兩種因素進行了詳細的測試:

測試1:相同格式微饥、不同分辨率的加載效率測試

我們選取了兩張分辨率為2048x2048的普通紋理資源逗扒,并在打成AssetBundle時,將其分辨率最大值分別設(shè)置為512x512欠橘、1024x1024和2048x20248矩肩,紋理格式均設(shè)置為ETC1(Android)和PVRTC(iOS)、且關(guān)閉Mipmap功能。所以黍檩,三組紋理的內(nèi)存占用分別為256KB叉袍、1MB和4MB,其對應(yīng)AssetBundle大小為156KB刽酱、531KB和1.92MB(對于Android平臺)喳逛、175KB、628KB和2.4MB(對于iOS平臺)棵里。Unity 版本為5.2润文,壓縮格式為默認(rèn)的LZMA壓縮。

Android平臺測試紋理:


我們在五種不同檔次的機型上加載這些紋理資源殿怜,為降低偶然性典蝌,每臺設(shè)備上重復(fù)進行十次加載操作并將取其平均值作為最終性能開銷。具體測試結(jié)果如下表所示头谜。


通過上述測試骏掀,我們可以得到以下結(jié)論:

1、紋理資源的分辨率對加載性能影響較大柱告,分辨率越高截驮,其加載越為耗時。設(shè)備性能越差际度,其耗時差別越為明顯侧纯;

2、設(shè)備越好甲脏,加載效率確實越高。但是妹笆,對于硬件支持紋理(ETC1/PVRTC)來說,中高端設(shè)備的加載效率差別已經(jīng)很小块请,比如圖中的紅米Note2和三星S6設(shè)備,差別已經(jīng)很不明顯拳缠。

測試2:不同格式墩新、相同分辨率的加載效率測試

我們選取了兩張分辨率為1024x1024的普通紋理資源,并在打成AssetBundle時窟坐,根據(jù)不同平臺將其紋理格式分別設(shè)置不同格式用于打包海渊。對于Android平臺,我們使用ETC1哲鸳、ETC2臣疑、RGBA16和RGBA32四種格式,對于iOS平臺徙菠,我們使用PVRTC 4BPP讯沈、RGBA16和RGBA32三種格式,同時婿奔,對于每張紋理均關(guān)閉Mipmap功能缺狠。所以问慎,三組紋理的內(nèi)存占用分別為1MB、1MB麻诀、4MB 和 8MB(Android平臺)/1MB言疗、4MB 和 8MB(iOS平臺)惊暴。

Android平臺測試紋理:


與測試1相同,我們在五種不同檔次的機型上重復(fù)進行十次加載操作并將取其平均值作為最終性能開銷笼恰。具體測試結(jié)果如下圖所示。?

Android設(shè)備:


iOS設(shè)備:


通過上述測試囚衔,我們可以得到以下結(jié)論:

1挖腰、紋理資源的格式對加載性能影響同樣較大,Android平臺上练湿,ETC1和ETC2的加載效率最高猴仑。同樣,iOS平臺上肥哎,PVRTC 4BPP的加載效率最高辽俗。

2、RGBA16格式紋理的加載效率同樣很高篡诽,與RGBA32格式相比崖飘,其加載效率與ETC1/PVRTC非常接近,并且設(shè)備越好杈女,加載開銷差別越不明顯朱浴;

3、RGBA32格式紋理的加載效率受硬件設(shè)備的性能影響較大达椰,ETC/PVRTC/RGBA16受硬件設(shè)備的影響較低翰蠢。

注意事項:這里需要指出的是測試中所使用的ETC1和ETC2紋理均為RGB 4Bit格式,所以對于半透明紋理貼圖啰劲,需要兩張ETC1格式的紋理進行支持(一張RGB通道梁沧,一張Alpha通道)。逐一加載兩張ETC1格式的紋理蝇裤,其加載效率要低于RGBA16格式廷支,但可以通過加載方式來進行彌補。這一點我們將在后續(xù)文章中進行詳細說明栓辜。

2. 開啟Mipmap功能

開啟Mipmap功能同樣會增大一部分紋理大小恋拍,一般來說,其內(nèi)存會增加至原始大小的1.33倍啃憎。因此芝囤,我們對開啟Mipmap功能前后的加載性能進行了詳細的測試:

測試3:開啟/關(guān)閉Mipmap功能的加載效率測試

我們?nèi)匀皇褂脙蓮埛直媛蕿?024x1024的普通紋理資源,分別使用ETC1格式、PVRTC格式悯姊、RGBA16格式和RGBA32格式(測試所用紋理與測試2相同)羡藐,并在打成AssetBundle時,一組開啟Mipmap功能悯许,一組關(guān)閉Mipmap功能仆嗦。

與測試1相同,我們在五種不同檔次的機型上重復(fù)進行十次加載操作并將取其平均值作為最終性能開銷先壕。具體測試結(jié)果如下圖所示瘩扼。

Android平臺:



iOS平臺:



通過上述測試,我們可以看出:?開啟Mipmap功能會導(dǎo)致資源加載更為耗時垃僚,且設(shè)備性能越差集绰,其加載效率影響越大。

通過以上性能測試谆棺,我們對于紋理資源的加載建議如下:

1栽燕、嚴(yán)格控制RGBA32和ARGB32紋理的使用,在保證視覺效果的前提下改淑,盡可能采用“夠用就好”的原則碍岔,降低紋理資源的分辨率,以及使用硬件支持的紋理格式朵夏。

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

3猛计、嚴(yán)格檢查紋理資源的Mipmap功能,特別注意UI紋理的Mipmap是否開啟爆捞。在UWA測評過的項目中,有不少項目的UI紋理均開啟了Mipmap功能勾拉,不僅造成了內(nèi)存占用上的浪費煮甥,同時也增加了不小的加載時間。

4藕赞、ETC2對于支持OpenGL ES3.0的Android移動設(shè)備來說成肘,是一個很好的處理半透明的紋理格式。但是斧蜕,如果你的游戲需要在大量OpenGL ES2.0的設(shè)備上進行運行双霍,那么我們不建議使用ETC2格式紋理。因為不僅會造成大量的內(nèi)存占用(ETC2轉(zhuǎn)成RGBA32),同時也增加一定的加載時間洒闸。下圖為測試2中所用的測試紋理在三星S3和S4設(shè)備上加載性能表現(xiàn)染坯。可以看出丘逸,在OpenGL ES2.0設(shè)備上单鹿,ETC2格式紋理的加載要明顯高于ETC1格式,且略高于RGBA16格式紋理深纲。因此仲锄,建議研發(fā)團隊在項目中謹(jǐn)慎使用ETC2格式紋理。


正是由于以上加載效率問題湃鹊,我們在UWA測評報告中加入了對每個檢測到的紋理資源參數(shù)的詳細展示儒喊,以方便開發(fā)團隊可以快速查看資源的使用情況,只需對相關(guān)信息列進行排序币呵,即可定位引發(fā)性能問題的具體資源怀愧。


說明:以上測試數(shù)據(jù)為我們所用的測試紋理加載數(shù)據(jù),需要指出的是富雅,不同紋理的加載效率是不相同的掸驱,因為其內(nèi)容的不同會造成AssetBundle壓縮包大小的不同,進而造成最終加載效率的不同没佑。這里我們給出的具體性能比較毕贼,其本意是讓大家通過數(shù)據(jù)直觀了解到紋理格式、分辨率和Mipmap功能對加載性能的影響蛤奢。另外鬼癣,我們后續(xù)會進行更多的測試,以期為大家提供更為普遍的測試結(jié)果啤贩。

以上為紋理資源在加載時的性能測試待秃。關(guān)于加載模塊的性能問題,我們會不斷推出網(wǎng)格痹屹、音頻等其他資源的加載性能分析章郁、資源卸載性能分析、資源實例化性能分析志衍、不同加載方式的性能分析等一系列技術(shù)文章暖庄,并對目前UWA所檢測過項目的共性問題進行總結(jié),以期讓大家對項目的加載效率有更加深入的認(rèn)知楼肪,并提升對加載模塊的掌控能力培廓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市春叫,隨后出現(xiàn)的幾起案子肩钠,更是在濱河造成了極大的恐慌泣港,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件价匠,死亡現(xiàn)場離奇詭異当纱,居然都是意外死亡,警方通過查閱死者的電腦和手機霞怀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門惫东,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毙石,你說我怎么就攤上這事廉沮。” “怎么了徐矩?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵滞时,是天一觀的道長。 經(jīng)常有香客問我滤灯,道長坪稽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任鳞骤,我火速辦了婚禮窒百,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豫尽。我一直安慰自己篙梢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布美旧。 她就那樣靜靜地躺著渤滞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榴嗅。 梳的紋絲不亂的頭發(fā)上妄呕,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音嗽测,去河邊找鬼绪励。 笑死,一個胖子當(dāng)著我的面吹牛唠粥,可吹牛的內(nèi)容都是我干的优炬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼厅贪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雅宾?” 一聲冷哼從身側(cè)響起养涮,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤葵硕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贯吓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懈凹,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年悄谐,在試婚紗的時候發(fā)現(xiàn)自己被綠了介评。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡爬舰,死狀恐怖们陆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情情屹,我是刑警寧澤坪仇,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站垃你,受9級特大地震影響椅文,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惜颇,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一皆刺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凌摄,春花似錦羡蛾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屯伞,卻和暖如春腿箩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背劣摇。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工珠移, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人末融。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓钧惧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親勾习。 傳聞我的和親對象是個殘疾皇子浓瞪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容