Unity性能分析(四)Unity性能分析工具使用

使用Profiler

按照以下步驟開始使用 Unity Profiler:

  • 在進行分析時,必須使用開發版本。File > Build Settings > Development Build。
  • 勾選Autoconnect Profile(可選)。
  • 注意:Autoconnect Profile會增加初始啓動時間。如果不啓用Autoconnect Profiler,可以隨時手動連接正在運行的開發版本。
  • 針對目標平臺進行構建。
  • 通過 Window > Analysis > Profiler 打開 Unity Profiler。
  • 禁用不關注的Profiler模塊。每個啓用的分析模塊都會帶來性能開銷。(可以使用Profiler.CollectGlobalStats標記觀察開銷。)
  • 禁用設備的移動網絡,保持 WiFi 開啓。
  • 在目標設備上運行構建版本。
  • 如果選擇Autoconnect Profiler,那麼構建版本中將會嵌入Editor所在機器的 IP 地址。啓動應用時,它將嘗試直接連接到此 IP 的Profiler。Profiler 將自動連接並開始顯示幀和分析信息。
  • 沒有選擇Autoconnect Profiler,則需要使用“Target Selection”下拉菜單手動連接。
Profiler與目標設備自動連接時

爲了節省構建時間(犧牲準確性),在Editor中直接分析。在Profiler窗口中,從Attach to Player下拉菜單中選擇Playmode。

在Playmode下分析

在CPU Usage中禁用VSync

CPU主線程在等待VSync時處於空閒狀態。重新排序顯示列表,使VSync標記位於頂部。這樣可以降低VSync標記的干擾降,使整體畫面更清晰。

在構建中禁用VSync

通過Edit > Project Settings,然後選擇Quality ,設置VSync Count爲Don't Sync。

發佈development版本,並連接到Profiler。遊戲不再等待下一個VBlank,而是在一幀完成後立即開始下一幀。禁用VSync可能會在某些平臺上產生視覺撕裂(這種情況下,爲release版本重新啓用VSync)。

什麼時候使用Playmode或Editor mode分析

使用Profiler時,可以選擇Playmode、Editor、遠程或附加設備作爲目標。使用Editor作爲分析目標,對分析的準確性有很大影響。因爲Profiler實際上也遞歸地對分析了自己本身。

然而當Editor的性能變差時,分析Editor就非常就有價值了,可以分析是什麼影響了Editor性能。

哪些情況需要包含Editor一起分析

使用Standalone Profiler

當在Editor下分析時,Standalone Profiler將作爲一個新的進程啓動。這避免了Profiler UI和Editor對時間統計的影響,以獲得更乾淨的分析數據。

在Editor中分析並快速迭代

如果在構建包中發現性能問題,可以先在Editor中驗證是否存在相同問題。如果存在問題,在Editor中定位並快速解決。一旦問題解決,再去目標設備上運行以驗證解決方案。

這種優化過工作流程,可以不必先花費時間構建部署,而是先在Editor中快速迭代,再使用分析工具驗證優化結果。

使用Frame Debugger

Frame Debugger在運行時允許暫停在指定幀,以查看渲染該幀的draw call信息。與其他幀調試工具相比,Frame Debugger有一個優點:如果draw call對應於某個 GameObject ,則該對象在Hierarchy面板中會突出顯示。Frame Debugger也可以用於測試overdraw。

使用Frame Debugger分析overdraw

從Window > Analysis > Frame Debugger菜單中打開Frame Debugge。 在編輯器中或設備上運行應用程序時,單擊Enable。應用程序將會暫停,並在幀調試窗口的左側按順序列出當前幀的所有draw call。還包括如幀緩衝清除事件等詳細信息。

Frame Debugger在左側列出draw call和event,並提供一個滑塊,可以逐幀顯示。

右側的面板提供了draw call的詳細信息,例如幾何細節和shader。其他信息還包括draw call無法與之前合批的原因,以及輸入到shader的屬性值。

選中一個draw call,詳細信息區域中顯示shader,不能合批的原因,shader屬性值。

除了shader屬性值,ShaderProperties部分還會顯示它在哪些階段中被使用(例如vertex, fragment, geometry,hull, domain)。

着色器階段會在ShaderProperties詳細信息區域中顯示

遠程Frame Debugging

在支持的平臺上(WebGL不支持),可以遠程連接到Frame Debug。

設置遠程frame debugging:

  • 創建目標平臺的標準構建。
  • 運行播放器。
  • 從Editor中打開Frame Debugger。
  • 單擊Player下拉列表,選擇正在運行的目標。
  • 單擊Enable。
Frame Debugger窗口遠程連接到構建

Render target顯示選項

Frame Debug窗口有一個工具欄,可以獨立顯示Game視圖的R、G、B、A通道。使用channel按鈕右側的Levels滑塊,按照亮度級別顯示。當存在多個渲染目標時,可以使用RenderTarget下拉列表選擇在Game視圖中顯示的渲染目標。

下拉列表還有一個Depth選項,用於顯示深度緩衝區的內容。

顯示深度緩衝區內容

5個常見染優化技巧

首先定位性能瓶頸。主流平臺都提供了分析CPU和GPU性能的工具。例如,Arm/Mali GPU,可以使用Arm Mobile Studio;Microsoft Xbox,可以使用PIX;Sony PlayStation,可以使用Razor;Apple iOS,可以使用Xcode Instruments。

1.draw call優化

降低draw call批次的技術包括:遮擋剔除;GPU實例化;SRP合批

2.減少overdraw,優化填充率

overdraw表明應用程序試圖在每幀內繪製比GPU處理能力更多的像素。這不僅會影響性能,還會影響移動設備的熱量和電池壽命。可以通過了解Unity在渲染對象之前如何對它們進行排序來解決過度繪製問題。

內置渲染管線根據對象的Rendering Mode和renderQueue進行排序。每個對象的着色器將其放入一個渲染隊列中,通常決定其繪製順序。

相互重疊的對象會產生過度繪製。如果正在使用內置渲染管線,請使用Scene viewcontrol來可視化overdraw。將繪製模式切換爲Overdraw。

亮色像素表示對象重疊繪製,而暗色像素表示重疊繪製較少

標準視圖
Overdraw視圖

 

3.檢查消耗性能的着色器

4.渲染的多線程優化

5.分析後處理效果

使用Profile Analyzer

Unity Profiler可以進行單幀分析,但是Profile Analyzer可以聚合顯示一組Unity Profiler幀捕獲的分析標記數據。

開始使用Profile Analyzer:通過Window> Package Manager 安裝Profile Analyzer包。

在使用Profile Analyzer時,一個好的方法是保存分析會話,在性能優化工作之前和之後進行比較。

Profile Analyzer會提取在Unity Profiler中捕獲的一組幀,對它們進行統計分析。然後顯示這些數據,爲每個函數生成性能時間信息,例如最小值、最大值、平均值和中位數時間。 在開發過程中,它可以幫助解決和優化問題。將其用於遊戲場景的A/B測試以查看性能差異,在較重構和優化代碼前後分析數據,以及升級新功能或Unity版本前後使用。

在Profile Analyzer 的 Single view中使用總計數據也可以找到隨時間變化的性能問題。

Profile Analyzer主窗口視圖

Profile Analyzer 具有多種視圖和分析性能數據的方式,它提供不同的面板用於選擇、排序、查看和比較一組性能分析數據。

Frame Control 面板用於選擇一幀或一組幀。選擇後,Marker Details 面板將更新,以顯示所選範圍的數據,包含統計信息的排序列表。Marker Summary 面板顯示選定標記的詳細信息。列表中的每個標記都是該標記在所選幀範圍內,跨所有篩選線程實例的聚合。

Marker Summary 面板顯示 Marker Details 面板中選擇的每個 Marker 集合的詳細信息。

使用Name Filter,或Thread進行篩選。當查看 Time 或 Count 統計值的範圍選擇時,這非常有用。

按線程或標記名稱進行篩選,以便在 Marker details 面板中關注特定的性能數據。

調整Filters時,Marker details面板可以自定義地顯示分析數據的不同信息集。使用Marker column下拉菜單選擇預設選項,或自定義選項。

使用Marker column的預設選項自定義Marker details面板顯示的統計信息。

這些預設選項包括:

  • Time and count:顯示markers平均計時和調用次數的信息
  • Time:顯示markers的平均計時信息
  • Totals: 顯示markers對整個數據集所需的總時間信息
  • Time with totals:同時顯示markers的平均計時和總時間信息
  • Count totals: 顯示markers被調用的總次數信息
  • Count per frame:顯示markers每幀被調用的平均總次數信息
  • Depths:顯示markers在層次結構中的位置信息
  • Threads: 顯示markers所在的線程名稱信息。

Profile Analyzer視圖

Single視圖

Single視圖顯示單個捕獲數據集的信息。使用它來分析每一幀profile markers的執行情況。該視圖分爲幾個面板,其中包含每幀、每個線程和每個標記的計時信息(最小值、最大值、中位值、平均值)。

Single視圖顯示單個或一組幀的profile marker統計信息和計時信息

Profile Analyzer使用提示

  • 通過選擇Depth level爲4,可以深入到用戶腳本中(忽略Unity Engine API)。在Unity Profiler timeline模式下查看,您可以對調用堆棧深度進行相關分析: Monobehaviour腳本將以藍色出現,並在第四個級別下。
  • 以同樣的方式過濾Unity其他部分,例如animators或engine physics。
  • 在Frame Summary部分的右側,可以找到突出顯示的方法性能範圍直方圖。將鼠標懸停在最耗時幀上,獲取可以點擊的鏈接,從而查看Unity Profiler中的幀選擇。使用此視圖來分析導致該幀消耗時間的因素。

Compare視圖

Compare視圖是Profile Analyzer真正發揮作用的地方。在此視圖中,您可以加載兩個數據集,Profile Analyzer將以兩種不同的顏色分別顯示兩個數據集。

通過“拉取數據”方法將配置文件會話數據加載到Profile Analyzer中:

  • 通過Window > Analysis > Profile Analyzer 打開Profile Analyzer。
  • 使用Unity Profiler捕獲數據。
  • 在Profile Analyzer中,切換到對比頁籤,然後單擊第一個“Pull Data”按鈕加載來自Profiler的捕獲數據。
  • 在代碼和性能改進之後,使用Unity Profiler再次捕獲數據。
  • 單擊第二個“Pull Data”按鈕加載新的捕獲數據。

注意:如果選擇加載選項,則數據必須採用Profile Analyzer的.pdata文件格式。如果擁有Profiler的.data格式的文件,請先在Profiler中打開它,然後單擊Profile Analyzer中的Pull Data按鈕。(確保在拉取數據之前保存Profiler的.data文件)

使用Marker Comparison查看第一組和第二組數據集(左側和右側)之間的計時差異。

調整Marker Columns filter會相應地更改要進行比較的值。

比較Median Frame和Longest Frame

在單個捕獲數據中比較Median Frame和Longest Frame,找到在Longest Frame中出現,在Median Frame中沒出現的事情,或查看哪些操作超過了平均完成時長。

打開Profile Analyzer的Compare視圖,在左右兩側加載同一個數據集。也可以在Single視圖中加載數據集,然後切換到Compare視圖。

右鍵點擊上側的Frame Control圖,選擇Select Median Frame。右鍵點擊下側Frame Control圖,選擇Select Longest Frame。

Profile Analyzer的Marker比較面板將更新顯示差異。

比較單個捕獲數據中的Median Frame和Longest Frame

一個技巧是,在比較數據時將Frame Control圖按幀時間排序(右鍵單擊>Order By Frame Duration),然後在每個集合中選擇一個範圍來進行比較。

按照持續時間排序並選擇範圍

關於介紹Profiler Analyzer的其他資源:

Optimize game with the Profile Analyzer

Introduction to profiling in Unity

Memory Profiler

Memory Profiler是Unity Package Manager中的附加包。使用Memory Profiler可以在Editor中或運行時對內存進行快照。

快照可以顯示引擎中的內存分配情況,幫助您快速識別導致過多或不必要的內存使用的原因,追蹤內存泄漏,或查看內存碎片情況。

安裝Memory Profiler package,通過點擊Window >Analysis > Memory Profiler來打開。

Memory Profiler的頂部菜單欄可用於更改選擇目標,捕獲或導入快照。

更改選擇,捕獲或導入內存快照

注意:通過將Memory Profiler連接到目標硬件並使用目標選擇下拉菜單,可以在遠程設備上對其進行剖析。在Unity Editor中進行剖析會因Editor和其他工具的開銷而導致不準確的數據。

在 Memory Profiler 窗口的左側是工作區。使用它來管理、打開或關閉保存的內存快照。您也可以使用該區域在單個快照和比較視圖之間切換。

Workbench面板用於管理內存快照

和Profile Analyzer類似,Memory Profiler允許您加載兩個內存快照進行比較。這在查看內存使用量隨時間或場景增長以及查找內存泄漏時特別有用。Memory Profiler的主窗口有幾個選項卡,可讓您深入研究內存快照,包括概要、對象和分配以及碎片化。

The Summary view

當您想要快速瞭解項目的內存使用情況時,請選擇此視圖。它還包含了捕獲的內存快照所涉及的有用和重要的內存相關數據。在快照被獲取的時間點,它非常適合快速查看正在發生的情況。

Summary view顯示了快照捕獲時的內存概覽。

Summary 視圖還顯示了一個內存使用的樹狀圖,可以進行深入挖掘以發現那些佔用最多內存的區域。

Summary view還顯示了快照捕獲時的內存使用情況的樹狀圖。

在樹狀圖視圖下方是一個被過濾的表格,它會更新以顯示所選單元中的對象列表。

樹狀圖顯示了與對象相關的內存,可以是本機對象或託管對象。

相比於本機對象內存,託管對象內存往往相對較小,在樹狀圖中很難被發現。您可以放大樹狀圖來查看這些內容,但對於較小的對象,通常使用表格來提供更好的概覽。單擊樹狀圖中的單元格將會將下方的表格按照該部分的類型進行過濾,並選擇感興趣的對象在對象和分配視圖中進行查看。

在內存快照中,經過篩選的對象表會更新,以顯示當前選定的樹狀圖格子中的對象。

你可以通過選擇表格或樹狀圖來跟蹤引用該列表中的對象以及可能駐留在哪些託管類字段中,然後在詳情側邊欄中檢查引用部分。如果側邊欄被隱藏,可以通過工具欄右上方的切換按鈕使其可見。

詳細信息面板包含引用和選擇詳細信息部分。引用部分顯示了在樹圖或表格中選擇的對象的引用。選擇詳細信息部分包含有關該對象或引用部分中任何選擇的對象的詳細信息。

注意:樹狀圖僅顯示內存中的Objects。它不是對跟蹤內存的完整表示。這一點很重要,因此如果你注意到內存使用概述的數字與跟蹤內存總數不一致,就要理解這一點。

這是因爲並非所有的native memory都與Objects相關聯。它還可以包括non-Object-associated的本機分配,例如可執行文件和DLL、NativeArrays等等。甚至更抽象的概念,比如“Reserved but unused memory ”也會影響本機分配的總量。

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