1. 程式人生 > >如何改善虛幻引擎中的遊戲執行緒CPU效能表現

如何改善虛幻引擎中的遊戲執行緒CPU效能表現

您遊戲中的幀頻率是不是太低? 您瞭解為什麼會發生這種現象嗎? 這是不是由於您同時生成了太多敵人?還是由於某個特定敵人過於消耗系統資源? 是由於您設定了過多的視覺特效,還是由於您所設計的戰鬥系統所造成的?

放鬆一下,不要一下子就得出結論!

嘗試修復任何效能問題的第一步是收集資訊,這樣您可以做出明智的決策,以確定下一步該怎麼做。 有些人會很自然地說這樣的話“當然慢啦! 這個關卡有100,000個actor耶!”,但如果您沒有收集適當的資料,您可能就會嘗試在關卡中花費大量時間來降低actor的數量,而沒有嘗試修復真正造成效能表現瓶頸的問題,這些問題可能是完全無關的問題,而且修復起來要容易得多。

明白! 可是從哪裡開始著手呢?

您要採集的第一份資料是需要了解,您的效能瓶頸到底是出現在遊戲執行緒中、在渲染(描畫)執行緒中、還是出現在GPU中。 要了解具體原因,您需要以非除錯版本來啟用遊戲,然後輸入控制檯命令“stat unit”,從而顯示完成各項任務需要花費多少時間。

CPU Performance

您的時間指的是生成遊戲中每一幀所需要花費的總體時間。 由於在完成一幀前會同時同步遊戲和描畫執行緒,時間常常接近於這些執行緒中的時間。 GPU時間衡量的是顯示卡需要多長時間來渲染場景。 由於GPU時間與幀同步,它的值很可能也類似於時間。

如果時間非常接近於遊戲時間,那麼您的瓶頸是遊戲執行緒。 如果時間非常接近於描畫時間,那麼您的瓶頸是渲染執行緒。 如果兩者都與GPU

時間不怎麼接近,那麼您的瓶頸就是顯示卡。

本文中,我們僅僅討論如何處理遊戲執行緒中的問題。

哇!現在我知道遊戲的瓶頸是遊戲執行緒啦、 接下來怎麼做?


檢視遊戲執行緒的效能表現的最佳工具是使用統計資料分析程式。 您可以在控制檯輸入“stat startfile”來啟用分析,您可以按下鍵盤上的波浪鍵 (~)來開啟控制檯。 讓我們至少執行10秒左右,這樣可以獲得許多幀間的良好平均值。 更長的分析時間也很好,而且我們可以使用它們來檢測間隙時間較長的問題,但一般不推薦讓分析時間超過30分鐘,因為這樣檔案就太大了。 當您獲得良好的時間樣本後,您可以輸入“stat stopfile”來終止分析。 在路徑Saved/Profiling/UnrealStats下,會有關於您專案資料夾的ue4stats檔案。

好的,我進行了分析。 我該如何開啟這個分析檔案?

如果需要開啟您捕獲的分析檔案,您必須使用UnrealFrontend(虛幻前端),它和UE4Editor位於同一個資料夾,或者您也可以開啟視窗選單中的編輯器的Session Frontend(會話前端)選項卡。 當您打開了會話前端選項卡後,您需要切換到Profiler(分析程式)的小選項卡。 在該處,您可以選擇載入您最近捕獲的ue4stats分析檔案。

Device Manager

我現在打開了分析檔案,我現在應該檢視哪些資料?

很重要的資訊就是位於底部的功能樹。 展開GameThread(遊戲執行緒)專案,然後往下拉,直到您看到超過幾毫秒的“Inc Time”(包含時間)條目,而且其不包含許多子項或不包含任何子項。 同時關注一下“Calls”(呼叫)數列,它顯示了每幀呼叫的統計資料的平均次數。 不要被“CPU Stall”(CPU停滯時間)專案弄糊塗了。 它們顯示的是執行緒等待處理其他內容時所花費的時間,所以不是主要資料,而且僅僅會在幀頻率受限或者遊戲程序不為瓶頸時才會顯示出來。 在下方的分析資料中,我們發現了存在問題的字型緩衝時間。

CPU Stall

這是本週在Fortnite中發現的真正問題! 在本例中,我們顯示了基於相機和重要遊戲物件間距離而變換大小的許多文字。 由於我們在每一幀都對文字調整大小,所以在Slate和虛幻引擎使用者介面系統中的字型快取中充滿了上百個相同的字串。 修復的方法是停止基於距離來動態縮放文字,也可以根據特定間距的閥值來分別變更文字大小。

這個方法對於Fortnite很好用,但我出現的問題不是“字型快取”。

您需要關注一些固定的需要注意的資料。

其中一個重要的專案是FTickFunctionTask。 此專案下是正在更新的每個actor和元件。 一般來說,降低每幀更新的actor和元件的數量都可以很好地加速遊戲。

FTickFunction Task

如果您的遊戲中存在著應永不更新的actor並且您正在使用C++程式碼,您可以將其放置在actor的建構函式中,以完全防止其更新:

PrimaryActorTick.bCanEverTick = false;

如果actor僅在某些時候進行更新,您可以轉而將其放置在建構函式中:

PrimaryActorTick.bCanEverTick = true;

PrimaryActorTick.bStartWithTickEnabled = false;

然後您可以使用SetActorTickEnabled函式來啟用和禁用更新。

另一個要關注的是BlueprintTime(藍圖時間)。 找到這個值的最佳方法是切換到包含(合併)檢視並在列表中找到它。 這樣就可以把所有的BlueprintTime(藍圖時間)條目組合到單一行中。 如果您選擇BlueprintTime(藍圖時間),然後切換回層次檢視,則其會選擇所有藍圖程式碼被執行的位置,這樣能讓您很好地瞭解花費時間進行處理的位置及其位於哪個藍圖中。

Average Speed

另一個常見的問題位置是TickWidgets(更新控制元件)。 如果這個統計資料值很高,這表示您可能同時顯示了太多控制元件,或者這些控制元件上的屬性代理過於複雜。 一些slate屬性,比如可見性,可能會在每幀被呼叫好幾次,這樣它們的值必須要小而且能及時返回。

您是不是在遊戲中有很多骨架網格物體? SkinnedMeshComp更新時間有時也會消耗很多系統資源。 請嘗試降低顯示在分析檔案中的骨架中的骨骼數量,或者降低動畫藍圖的複雜度。 如果您不需要在無法看到骨架網格物體時更新動畫,請考慮將骨架網格物體元件上的MeshComponentUpdateFlag(網格物體元件更新標識)正確設定為OnlyTickPoseWhenRendered(僅在渲染時更新姿勢)。 請注意,將此標識設定為AnimNotifies(動畫通知)將使得這些網格物體不被渲染時不再對其進行觸發。

實際上,我正在查詢為何遊戲不斷地產生卡頓。

最好的方法是尋找時間軸中出現的頓卡,選擇其周圍的幀,然後將檢視變更為“最大“,而不是“平均“。 這樣會變更所有數字,從而在選擇的幀數範圍中顯示峰值,而不是顯示平均值。

Graph View

謝謝!

相關推薦

如何改善虛幻引擎遊戲執行CPU效能表現

您遊戲中的幀頻率是不是太低? 您瞭解為什麼會發生這種現象嗎? 這是不是由於您同時生成了太多敵人?還是由於某個特定敵人過於消耗系統資源? 是由於您設定了過多的視覺特效,還是由於您所設計的戰鬥系統所造成的? 放鬆一下,不要一下子就得出結論! 嘗試修復任何效能問題的第一步是收集

檢視JAVA程序哪個執行CPU消耗最高

一,在centos linux 上檢視程序佔用cpu過高 top  shift+h 檢視哪個程序程消耗最高 二,檢視JAVA程序中哪個執行緒消耗最高 2.1 匯出java執行的執行緒資訊 jstack 程序id(jps檢視) jstack 程序id

java程式執行cpu使用率計算

原文地址:https://www.imooc.com/article/27374 最近確實遇到題目上的剛需,也是花了一段時間來思考這個問題。 cpu使用率如何計算     計算使用率在上學那會就經常算,不過往往計算的是整個程式執行的時間段,現

關於linux的程序的各個執行cpu佔用情況的分析和檢視

我們常常會在新開的服搭建一個遊戲的server,有時候要進行壓力測試,那麼怎樣來看呢,一般我們會通過top命令檢視各個程序的cpu和記憶體佔用情況,獲得到了我們的程序id,然後我們或許會通過pstack命令檢視裡邊的各個執行緒id以及相應的執行緒如今正在做什麼事情,分析多組資料就能夠獲得哪些執行緒裡

寫下來回頭看,在遊戲隱藏執行思路r3

方法一 1.在遊戲程序執行緒列表裡 選一個遊戲的執行緒 並記錄執行緒入口 2.對該執行緒入口下HOOK跳轉到自己的函式 3.然後立刻建立執行緒 執行緒建立完後 再把HOOK恢復即可 這個只能達到披羊皮效果 方法二 HOOK遊戲視窗訊息處理 (那個視窗訊息處理的迴圈體)直接

linux 下檢視某一程序的cpu使用率和這個執行各個執行cpu使用率

在Ubuntu/CentOS等linux系統中, 在除錯程式過程中,有時需要檢視程式的CPU的使用率和程式的各個程序的使用率. 那麼首先需要獲取這個程序的PID: ps -ef|grep [process name] 然後檢視該程序的CPU: top -p [PID]

Linux如何精準定位JVM執行CPU過高

    此文提供一種方法來快速定位Linux中JVM的執行緒CPU過高的問題。執行在Linux上的JVM的一個核心概念是:Java執行緒通過native threads實現,這導致Java中的每個執行緒對應著一個獨立的Linux程序。     仍然需要生成jvm程序的thr

關於windebug查詢程序各個執行佔用cpu時間,解決CPU佔用很大問題

按照如下步驟進行: (1)如果在除錯,請在vs中的除錯選單中分離選單專案,將除錯程序與vs分離; (2)啟動windebug,設定改程序的符號檔案路徑,符號檔案分為兩種,一個是系統的符號檔案,一個是自己程序的符號檔案,關於符號檔案設定比較簡單,網路找到即可,我的符號檔案設

top、ps命令檢視程序執行方法

方法一:PS ps -a顯示所有程序pid,“-T”選項可以開啟執行緒檢視。 eg: ps -aT 顯示所有執行緒 方法二: Top top用於實時檢視各個執行緒情況,用top命令的“-H”選項,該選項會列出所有Linux執行緒。 eg1. top -H 所有執行緒 eg2.

執行執行設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

Spring 執行安全性

Spring與執行緒安全   Spring作為一個IOC/DI容器,幫助我們管理了許許多多的“bean”。但其實,Spring並沒有保證這些物件的執行緒安全,需要由開發者自己編寫解決執行緒安全問題的程式碼。   Spring對每個bean提供了一個s

Qt實現執行安全的單例模式

之前專案中用到單例模式,用的是執行緒不安全的,這次專案用到了多執行緒,所以想到實現一個執行緒安全的單例模式。經過查詢資料,發現Qt本身有自己的執行緒安全單例模式實現方式。 Q_GLOBAL_STATIC巨集 使用方法:MonitorWindow.h #ifndef MONITORW

觀察者模式執行執行訂閱事件並順序執行的問題

       對事件釋出訂閱模式中啟動執行緒執行操作,但又要保證執行緒順序執行的一些思考和實踐,在開發過程中,經常會遇到需要使用事件來觸發方法執行的情況,比如CS中按鈕的點選事件,滑鼠移動事件,鍵盤監聽事件等等,有時候需要執行比較耗時的任務,但並不希望阻塞主執

Java語言執行安全

執行緒安全定義:當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要考慮進行額外的同步,或者在呼叫方進行任何其他的寫作操作,呼叫這個物件的行為都可以獲得正確的結果,那這個物件時執行緒安全的。 將Java語言中的各種操作共享的資料分為以下五類: 不可

MFC開啟執行

MFC標頭檔案中編寫:分檔案類外定義的資料   public: //執行緒 BOOL m_bThread; 再MFC的初始化中,編寫如下程式碼 //_建立執行緒 AfxBeginThread(ThreadProc,(LPVOID)this); m_bThread=

Java停止執行

一.停止執行緒會帶來什麼? 對於單執行緒中,停止單執行緒就是直接使用關鍵字return或者break,但是在停止多執行緒時是讓執行緒在完成任務前去開啟另外一條執行緒,必須放棄當前任務,而這個過程是不可預測,所以必須去做好防備。 二.認識停止執行緒的幾個方法  2.1三個被棄用的

Spring4.x執行使用

直接上程式碼: 一:配置類 import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springfram

powerbuilder 使用執行的方法

//宣告物件變數  ccuo_thread lccuo_thread  //建立新執行緒  SharedObjectRegister ('ccuo_thread' ,'thread_center' )  //引用例項  SharedObje

Android執行執行

執行緒與執行緒池 概括 執行緒分為主執行緒和子執行緒. 主執行緒主要是用來處理和介面相關的事情, 子執行緒主要是用來做耗時的操作,比如 載入遠端資料,資料庫操作等。 在android 中,處理直接使用 Thread以外。 android 還提供了很多類似執行緒的操作便於我們

Jprofile - 檢視執行CPU耗時

1. 點選CPU views -> Call Tree -> Press Record   2.執行應用程式操作就可以看到該步操作在後臺的耗時情況,Thread Status可以選擇,區別如下(例如查詢DB)   Runnable &nbs