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

Flamesky發表於2024-04-30

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

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

分析工具是開發者的實用工具之一,可以幫助開發者定位程式碼中的記憶體問題和效能瓶頸,也能幫助瞭解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等。

Unity效能分析(一)流程與工具的使用
分析一個示例指令碼,顯示了Update()方法呼叫Unity的Instantiate()方法

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

Unity效能分析(一)流程與工具的使用
使用Camera.main會在捕獲分析資料中出現FindMainCamera標記。

使用Profiler markers增加分析詳細資訊

預設情況下,Profiler會分析Profiler markers中包含程式碼的時間開銷。在程式碼的關鍵函式中手動插入Profiler markers可增加詳細資訊而不產生全部的深層分析開銷。

Profiler模組

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

Unity效能分析(一)流程與工具的使用
Profiler視窗主檢視,左側顯示模組,底部顯示詳細資訊。

Profiler視窗在檢視底部皮膚中列出了當前分析器模組捕獲的詳細資訊。例如,CPU usage模組顯示CPU工作的timeline或hierarchy檢視,以及具體的時間。

Unity效能分析(一)流程與工具的使用
CPU usage模組的timeline檢視,顯示主執行緒和渲染執行緒的標記詳細資訊。

預設情況下,分析器將連線到Unity Editor player例項。

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

相關文章