UE4 性能優化工具(Profiler Tool)
Profiler Tool Reference
https://docs.unrealengine.com/latest/INT/Engine/Performance/Profiler/index.html
原文:
https://www.unrealengine.com/zh-CN/blog/how-to-improve-game-thread-cpu-performance
您游戲中的幀頻率是不是太低? 您了解為什么會發生這種現象嗎? 這是不是由于您同時生成了太多敵人?還是由于某個特定敵人過于消耗系統資源? 是由于您設置了過多的視覺特效,還是由于您所設計的戰斗系統所造成的?
放松一下,不要一下子就得出結論!
嘗試修復任何性能問題的第一步是收集信息,這樣您可以做出明智的決策,以確定下一步該怎么做。 有些人會很自然地說這樣的話“當然慢啦! 這個關卡有100,000個actor耶!”,但如果您沒有收集適當的數據,您可能就會嘗試在關卡中花費大量時間來降低actor的數量,而沒有嘗試修復真正造成性能表現瓶頸的問題,這些問題可能是完全無關的問題,而且修復起來要容易得多。
明白! 可是從哪里開始著手呢?
您要采集的第一份數據是需要了解,您的性能瓶頸到底是出現在游戲線程中、在渲染(描畫)線程中、還是出現在GPU中。 要了解具體原因,您需要以非調試版本來啟用游戲,然后輸入控制臺命令“stat unit”,從而顯示完成各項任務需要花費多少時間。
您的幀時間指的是生成游戲中每一幀所需要花費的總體時間。 由于在完成一幀前會同時同步游戲和描畫線程,幀時間常常接近于這些線程中的時間。 GPU時間衡量的是顯卡需要多長時間來渲染場景。 由于GPU時間與幀同步,它的值很可能也類似于幀時間。
如果幀時間非常接近于游戲時間,那么您的瓶頸是游戲線程。 如果幀時間非常接近于描畫時間,那么您的瓶頸是渲染線程。 如果兩者都與GPU時間不怎么接近,那么您的瓶頸就是顯卡。
本文中,我們僅僅討論如何處理游戲線程中的問題。
哇!現在我知道游戲的瓶頸是游戲線程啦、 接下來怎么做?
查看游戲線程的性能表現的最佳工具是使用統計數據分析程序。 您可以在控制臺輸入“stat startfile”來啟用分析,您可以按下鍵盤上的波浪鍵 (~)來打開控制臺。 讓我們至少運行10秒左右,這樣可以獲得許多幀間的良好平均值。 更長的分析時間也很好,而且我們可以使用它們來檢測間隙時間較長的問題,但一般不推薦讓分析時間超過30分鐘,因為這樣文件就太大了。 當您獲得良好的時間樣本后,您可以輸入“stat stopfile”來終止分析。 在路徑Saved/Profiling/UnrealStats下,會有關于您項目文件夾的ue4stats文件。
好的,我進行了分析。 我該如何打開這個分析文件?
如果需要打開您捕獲的分析文件,您必須使用UnrealFrontend(虛幻前端),它和UE4Editor位于同一個文件夾,或者您也可以打開窗口菜單中的編輯器的Session Frontend(會話前端)選項卡。 當您打開了會話前端選項卡后,您需要切換到Profiler(分析程序)的小選項卡。 在該處,您可以選擇載入您最近捕獲的ue4stats分析文件。
我現在打開了分析文件,我現在應該查看哪些數據?
很重要的信息就是位于底部的功能樹。 展開GameThread(游戲線程)項目,然后往下拉,直到您看到超過幾毫秒的“Inc Time”(包含時間)條目,而且其不包含許多子項或不包含任何子項。 同時關注一下“Calls”(調用)數列,它顯示了每幀調用的統計數據的平均次數。 不要被“CPU Stall”(CPU停滯時間)項目弄糊涂了。 它們顯示的是線程等待處理其他內容時所花費的時間,所以不是主要數據,而且僅僅會在幀頻率受限或者游戲進程不為瓶頸時才會顯示出來。 在下方的分析數據中,我們發現了存在問題的字體緩沖時間。
這是本周在Fortnite中發現的真正問題! 在本例中,我們顯示了基于相機和重要游戲對象間距離而變換大小的許多文本。 由于我們在每一幀都對文本調整大小,所以在Slate和虛幻引擎用戶界面系統中的字體緩存中充滿了上百個相同的字符串。 修復的方法是停止基于距離來動態縮放文本,也可以根據特定間距的閥值來分別變更文本大小。
這個方法對于Fortnite很好用,但我出現的問題不是“字體緩存”。
您需要關注一些固定的需要注意的數據。
其中一個重要的項目是FTickFunctionTask。 此項目下是正在更新的每個actor和組件。 一般來說,降低每幀更新的actor和組件的數量都可以很好地加速游戲。
如果您的游戲中存在著應永不更新的actor并且您正在使用C++代碼,您可以將其放置在actor的構造函數中,以完全防止其更新:
PrimaryActorTick.bCanEverTick = false;
如果actor僅在某些時候進行更新,您可以轉而將其放置在構造函數中:
PrimaryActorTick.bCanEverTick = true;
PrimaryActorTick.bStartWithTickEnabled = false;
然后您可以使用SetActorTickEnabled函數來啟用和禁用更新。
另一個要關注的是BlueprintTime(藍圖時間)。 找到這個值的最佳方法是切換到包含(合并)視圖并在列表中找到它。 這樣就可以把所有的BlueprintTime(藍圖時間)條目組合到單一行中。 如果您選擇BlueprintTime(藍圖時間),然后切換回層次視圖,則其會選擇所有藍圖代碼被執行的位置,這樣能讓您很好地了解花費時間進行處理的位置及其位于哪個藍圖中。
另一個常見的問題位置是TickWidgets(更新控件)。 如果這個統計數據值很高,這表示您可能同時顯示了太多控件,或者這些控件上的屬性代理過于復雜。 一些slate屬性,比如可見性,可能會在每幀被調用好幾次,這樣它們的值必須要小而且能及時返回。
您是不是在游戲中有很多骨架網格物體? SkinnedMeshComp更新時間有時也會消耗很多系統資源。 請嘗試降低顯示在分析文件中的骨架中的骨骼數量,或者降低動畫藍圖的復雜度。 如果您不需要在無法看到骨架網格物體時更新動畫,請考慮將骨架網格物體組件上的MeshComponentUpdateFlag(網格物體組件更新標識)正確設置為OnlyTickPoseWhenRendered(僅在渲染時更新姿勢)。 請注意,將此標識設置為AnimNotifies(動畫通知)將使得這些網格物體不被渲染時不再對其進行觸發。
實際上,我正在查找為何游戲不斷地產生卡頓。
最好的方法是尋找時間軸中出現的頓卡,選擇其周圍的幀,然后將視圖變更為“最大“,而不是“平均“。 這樣會變更所有數字,從而在選擇的幀數范圍中顯示峰值,而不是顯示平均值。
謝謝!
對總體游戲性能來說,使用分析程序是很關鍵的。這樣可以通過防止您因無法了解真正的問題而過度猜測。 如需了解分析程序中所有功能的更多信息,請訪問我們的文檔頁面。https://docs.unrealengine.com/latest/INT/Engine/Performance/Profiler/index.html
-
分享到:
全部評論:0條