1. 程式人生 > >Unity移動遊戲載入效能和記憶體管理-學習筆記

Unity移動遊戲載入效能和記憶體管理-學習筆記

前言

正在學習Doctor 張.鑫大佬的移動遊戲載入效能和記憶體管理,內容非常非常的幹,所以我燒了很多開水,邊喝邊看,一邊拿小本幾做好筆記

本文只是關於前2章的內容筆記,關於各種資源的載入耗時

紋理資源載入耗時


重複載入十次,取平均值

紋理尺寸測試結論

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

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


紋理格式測試結論

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

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

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

網格資源載入耗時

網格面數載入耗時結論

1、資源的資料量對載入效能影響較大,面片數越多,其載入越為耗時。裝置效能越差,其耗時差別越為明顯;

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

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

網格頂點屬性測試結論

1、頂點屬性的增加對記憶體和AssetBundle包體大小影響較大。與測試1中未引入Tangent頂點屬性的網格資料相比,測試2中的網格資料在記憶體上均大幅度增加(增加量與網格頂點數有關),且AssetBundle大小同樣有成倍(1~2)的增加。

2、頂點屬性增加對於載入效率影響較大,且頂點數越多,影響越大。

網格載入結論

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

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

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

AnimationClip資源載入耗時

防範大於救災!

資源載入耗時測試結論

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

這裡是說的一個動畫精度的問題,unity的動畫檔案是一個txt,開啟後可以把浮點數的精度,從小數點8位,壓縮到3位。 在記憶體跟體積上都有很大提升

動畫型別,Humanoid會比Generic型別小很多,其原理是因為Humanoid把動畫資料轉到了肌肉空間,從原來的xyzw四個值,變成了一個value值,所以體積小很多

Shader載入耗時

Shader解析耗時結論

1、Shader資源的物理體積與記憶體佔用雖然很小,但其載入耗時開銷的CPU佔用很高,這主要是因為Shader的解析CPU開銷很高,成為了Shader資源載入的效能瓶頸;

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

3、除Mobile/Particles Additive外,其他三個主流Shader在載入時均會造成明顯的降幀,甚至卡頓。因此,研發團隊應儘可能避免在非切換場景時刻進行Shader的載入操作;

4、隨著硬體裝置效能的提升,其解析效率差異越來越不明顯。

Shader解析耗時如何優化?

1、通過依賴關係打包,將專案中的所有Shader抽離並打成一個獨立的AssetBundle檔案,其他AssetBundle與其建立依賴;

2、Shader的AssetBundle檔案在遊戲啟動後即進行載入並常駐記憶體,因為一款專案的Shader種類數量一般在50~100不等,且每個均很小,即便全部常駐記憶體,其記憶體總佔用量也不會超過2MB;

3、後續Prefab載入和例項化後,Unity引擎會通過AssetBundle之間的依賴關係直接找到對應的Shader資源進行使用,而不會再進行載入和解析操作。

音訊資源

結論

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

背景音樂建議用Streaming + 開啟Load in Background模式在子執行緒載入

技能音效可以使用Decompressed On Load,降低cpu開銷,記憶體會大一些,不過技能音訊都比較短

粒子系統載入耗時

建議材質剝離,不然每個粒子系統都要載入材質耗時變高
建議多個常用粒子系統,捆綁在一起載入

總結

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

  1. 紋理資源載入
  2. 網格載入
  3. Animation載入
  4. Shader解析
  5. 音訊資源

資源載入的優化是遊戲效能優化非常重要的部分!

各種型別的資源,都可以通過合理的設定跟取捨,極大的影響到我們的載入耗時跟記憶體開銷。

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

視訊裡有一句話說的很好:

防範大於救火

這章就結束啦,後面還有載入解除安裝的管理,以及例項化、記憶體優化。

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

參考:

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

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