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