Unity移動游戲加載性能和內(nèi)存管理-學(xué)習(xí)筆記

前言

正在學(xué)習(xí)Doctor 張.鑫大佬的移動游戲加載性能和內(nèi)存管理,內(nèi)容非常非常的干,所以我燒了很多開水,邊喝邊看,一邊拿小本幾做好筆記

本文只是關(guān)于前2章的內(nèi)容筆記,關(guān)于各種資源的加載耗時

紋理資源加載耗時


重復(fù)加載十次,取平均值

紋理尺寸測試結(jié)論

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

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


紋理格式測試結(jié)論

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

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

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

網(wǎng)格資源加載耗時

網(wǎng)格面數(shù)加載耗時結(jié)論

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

2、隨著硬件設(shè)備性能的提升,其加載效率差異越來越不明顯。

相同面片數(shù)、不同頂點屬性的加載效率測試

網(wǎng)格頂點屬性測試結(jié)論

1、頂點屬性的增加對內(nèi)存和AssetBundle包體大小影響較大。與測試1中未引入Tangent頂點屬性的網(wǎng)格數(shù)據(jù)相比,測試2中的網(wǎng)格數(shù)據(jù)在內(nèi)存上均大幅度增加(增加量與網(wǎng)格頂點數(shù)有關(guān)),且AssetBundle大小同樣有成倍(1~2)的增加。

2、頂點屬性增加對于加載效率影響較大,且頂點數(shù)越多,影響越大。

網(wǎng)格加載結(jié)論

1、在保證視覺效果的前提下,盡可能采用“夠用就好”的原則,即降低網(wǎng)格資源的頂點數(shù)量和面片數(shù)量;

2、研發(fā)團隊對于頂點屬性的使用需謹慎處理。通過以上分析可以看出,頂點屬性越多,則內(nèi)存占用越高,加載時間越長;

3、如果在項目運行過程中對網(wǎng)格資源數(shù)據(jù)不進行讀寫操作(比如Morphing動畫等),那么建議將Read/Write功能關(guān)閉,既可以提升加載效率,又可以大幅度降低內(nèi)存占用。

AnimationClip資源加載耗時

防范大于救災(zāi)!

資源加載耗時測試結(jié)論

  1. Optimal壓縮方式確實可以提升資源的加載效率,無論是在高端機、中端機還是低端機上;
  2. 硬件設(shè)備性能越好,其加載效率越高。但隨著設(shè)備的提升,Keyframe Reduction和Optimal的加載效率提升已不十分明顯;
  3. Optimal壓縮方式可能會降低動畫的視覺質(zhì)量,因此,是否最終選擇Optimal壓縮模式,還需根據(jù)最終視覺效果的接受程度來決定。

這里是說的一個動畫精度的問題,unity的動畫文件是一個txt,打開后可以把浮點數(shù)的精度,從小數(shù)點8位,壓縮到3位。 在內(nèi)存跟體積上都有很大提升

動畫類型,Humanoid會比Generic類型小很多,其原理是因為Humanoid把動畫數(shù)據(jù)轉(zhuǎn)到了肌肉空間,從原來的xyzw四個值,變成了一個value值,所以體積小很多

Shader加載耗時

Shader解析耗時結(jié)論

1、Shader資源的物理體積與內(nèi)存占用雖然很小,但其加載耗時開銷的CPU占用很高,這主要是因為Shader的解析CPU開銷很高,成為了Shader資源加載的性能瓶頸;

2、Mobile/Particles Additive在解析方面的耗時遠小于Mobile/Diffuse、Mobile/Bumped Diffsue甚至Mobile/VertexLit;

3、除Mobile/Particles Additive外,其他三個主流Shader在加載時均會造成明顯的降幀,甚至卡頓。因此,研發(fā)團隊?wèi)?yīng)盡可能避免在非切換場景時刻進行Shader的加載操作;

4、隨著硬件設(shè)備性能的提升,其解析效率差異越來越不明顯。

Shader解析耗時如何優(yōu)化?

1、通過依賴關(guān)系打包,將項目中的所有Shader抽離并打成一個獨立的AssetBundle文件,其他AssetBundle與其建立依賴;

2、Shader的AssetBundle文件在游戲啟動后即進行加載并常駐內(nèi)存,因為一款項目的Shader種類數(shù)量一般在50~100不等,且每個均很小,即便全部常駐內(nèi)存,其內(nèi)存總占用量也不會超過2MB;

3、后續(xù)Prefab加載和實例化后,Unity引擎會通過AssetBundle之間的依賴關(guān)系直接找到對應(yīng)的Shader資源進行使用,而不會再進行加載和解析操作。

音頻資源

image.png

結(jié)論

從包體大小來說,使用mp3包的體積會下來,如果對音質(zhì)要求不大的,建議用mp3格式

背景音樂建議用Streaming + 開啟Load in Background模式在子線程加載

技能音效可以使用Decompressed On Load,降低cpu開銷,內(nèi)存會大一些,不過技能音頻都比較短

粒子系統(tǒng)加載耗時

建議材質(zhì)剝離,不然每個粒子系統(tǒng)都要加載材質(zhì)耗時變高
建議多個常用粒子系統(tǒng),捆綁在一起加載

總結(jié)

本篇從以下幾大塊,列舉了unity游戲加載的各類耗時

  1. 紋理資源加載
  2. 網(wǎng)格加載
  3. Animation加載
  4. Shader解析
  5. 音頻資源

資源加載的優(yōu)化是游戲性能優(yōu)化非常重要的部分!

各種類型的資源,都可以通過合理的設(shè)置跟取舍,極大的影響到我們的加載耗時跟內(nèi)存開銷。

比如shader,去掉FallBack,就可使MobileDiffuse之解析耗時從59.9降低到27.6ms,降低了64%

視頻里有一句話說的很好:

防范大于救火

這章就結(jié)束啦,后面還有加載卸載的管理,以及實例化、內(nèi)存優(yōu)化。

好了我要睡覺了 —— 02:43

參考:

https://edu.uwa4d.com/course-intro/1/112

https://blog.uwa4d.com/archives/Loading_AnimationClip.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容