Unity性能分析(一)流程與工具的使用

性能分析工作流對於遊戲開發是“必備”的,從基本的三方面開始:

  • 在修改之前分析:建立基準線
  • 在開發過程中分析:確保修改不會影響性能
  • 在修改後分析:證明修改產生了預期效果

分析工具是開發者的實用工具之一,可以幫助開發者定位代碼中的內存問題和性能瓶頸,也能幫助瞭解Unity引擎底層的運行。

Unity提供了多種分析工具,用於在Editor和目標設備上分析代碼。建議使用各目標平臺(例如Arm,Apple,PlayStation和Xbox等)自己的原生分析工具。

理解Unity中的分析工作

Unity的分析工具可在Editor和Package Manager中獲得:

  • Unity Profiler:在Editor中,或連接到設備上,分析遊戲的性能。
  • Profiling Core package:提供API,可以向Unity Profile捕獲添加上下文信息。
  • Memory Profiler:提供深入內存性能分析。
  • Profile Analyzer:比較兩個分析數據集,分析修改對性能的影響。

採樣法分析vs儀表法分析

遊戲性能分析通常採用:

  • 採樣法分析
  • 儀表法分析

採樣法分析是收集遊戲運行時的統計數據並進行分析。

採樣法分析器每n納秒檢測一次調用堆棧,並利用堆棧信息查明函數的調用時機(由哪些函數調用),以及持續時間。在這種分析方法中,提高採樣率頻率會提高準確性,但是會帶來更高的開銷。

儀表法分析

儀表法分析通過添加Profiler makers來“儀表化”代碼,記錄每個標記中的代碼執行的詳細時間信息。該分析器爲每個標記捕獲一系列Begin和End事件。這種方法不會丟失任何信息,但是需要按順序放置標記,以便捕獲數據。

Unity Profiler通過在多數Unity API接口設置標記,在重要原生函數和腳本代碼間的調用進行了儀表化,捕獲最重要的“概括信息”。也支持添加自定義Profiler makers進一步深入分析。

深層分析會自動在每個腳本方法調用中插入Begin和End標記,包括C# Getter和Setter屬性。該系統在腳本側提供了完整的分析細節,但也帶來了相應的開銷,根據在捕獲的分析範圍內調用次數的多少,也會讓分析報告的時間產生膨脹。

Unity中的儀表化分析

如上所述,腳本代碼調用(默認進行了儀表化)通常包括從Unity原生代碼到託管代碼的第一個調用堆棧。例如MonoBehaviour的常見方法:Start、Update、FixedUpdate等。

分析一個示例腳本,顯示了Update()方法調用Unity的Instantiate()方法

在Profiler中,還可以看到Unity API回調的腳本代碼的子採樣。值得注意的是,涉及的Unity API代碼需要具有自身的Profiler markers。大多數帶有性能開銷的Unity API都進行了儀表化。例如Camera.main會導致在捕獲的分析數據中出現FindMainCamera標記。在檢查捕獲的數據集時,瞭解不同marker的含義非常重要。請使用常用Profiler markers列表來了解更多信息。

使用Camera.main會在捕獲分析數據中出現FindMainCamera標記。

使用Profiler markers增加分析詳細信息

默認情況下,Profiler會分析Profiler markers中包含代碼的時間開銷。在代碼的關鍵函數中手動插入Profiler markers可增加詳細信息而不產生全部的深層分析開銷。

Profiler模塊

分析器以每幀性能指標爲基礎,幫助找到瓶頸。通過使用分析器中包含的Profiler模塊,如CPU Usage, GPU, Rendering, Memory, Physics等,深入瞭解細節。

Profiler窗口主視圖,左側顯示模塊,底部顯示詳細信息。

Profiler窗口在視圖底部面板中列出了當前分析器模塊捕獲的詳細信息。例如,CPU usage模塊顯示CPU工作的timeline或hierarchy視圖,以及具體的時間。

CPU usage模塊的timeline視圖,顯示主線程和渲染線程的標記詳細信息。

默認情況下,分析器將連接到Unity Editor player實例。

在 Editor中進行分析和對獨立構建分析的性能差異很大。將Profiler連接到目標設備上的獨立構建是更好的選擇,這樣可以獲得更準確的結果,而不受Editor開銷的影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章