Stat命令(chs en)提供了游戲和引擎各個方面的實時統計信息,輸入不同參數會在屏幕HUD上顯示對應統計數據。
Debug、Development包才會啟用STATS宏,統計邏輯才會編譯進可執行二進制中,才能使用Stat命令相關的功能
若想讓Shipping和Test包也有Stat命令功能,可在UnrealEngine\Engine\Source\Runtime\Core\Public\Misc\Build.h中將FORCE_USE_STATS宏定義成1
/** Compile flag to force stats to be compiled */ #ifndef FORCE_USE_STATS #define FORCE_USE_STATS 1 #endif
開啟stats會帶來一定的性能損耗,幀率會下降6.6%,cpu平均占用高4.6%,內存會漲15MB,也會把FName表撐大一些
統計相關的所有邏輯在:UnrealEngine\Engine\Source\Runtime\Core\Public\Stats\*.h和UnrealEngine\Engine\Source\Runtime\Core\Private\Stats\*.cpp中
Stat類別定義在:UnrealEngine\Engine\Source\Runtime\Core\Public\Stats\Stats2.h
Stat命令的HUD繪制邏輯在StatsRender2.cpp中,3種Title頭的渲染在以下函數中:
Counters Average Max Min // RenderCounterHeadings 進度條的百分比為:Average / t.TargetFrameTimeThreshold
Memory Counters UsedMax Mem% MemPool Pool Capacity // RenderMemoryHeadings 如:Stat memory用的是該Title頭
Cycle counters (flat) | Cycle counters (hierarchy) CallCount InclusiveAvg InclusiveMax [ExclusiveAvg ExclusiveMax] // RenderGroupedHeadings 進度條的百分比為:InclusiveAvg / t.TargetFrameTimeThreshold
注:t.TargetFrameTimeThreshold的缺省值為33.9 ms
各統計項解釋:
Counters:當前統計項名稱
Average:最近60幀記錄中的平均值
Max:最近60幀記錄中的最大值
Min:最近60幀記錄中的最小值
Memory Counters:當前統計項名稱
UsedMax:最近60幀記錄中內存使用的最大值
Mem%:UsedMax在Pool Capacity中的占比
Cycle counters (flat):當前統計項名稱
Cycle counters (hierarchy) :當前統計項名稱(樹型結構)
CallCount :最近60幀記錄的平均調用次數
InclusiveAvg:最近60幀記錄的平均包含時間消耗
InclusiveMax:最近60幀記錄中的最大包含時間消耗
ExclusiveAvg:最近60幀記錄的平均獨占時間消耗
ExclusiveMax:最近60幀記錄中的最大獨占時間消耗
注:FStatParams結構體MaxHistoryFrames變量缺省為60,所以統計是60幀記錄
Stat的Engine命令執行在UEngine::HandleStatCommand函數中
DECLARE_STATS_GROUP(TEXT("AI"),STATGROUP_AI, STATCAT_Advanced); // 會定義一個類型為FStatGroup_STATGROUP_AI的結構體 那么就可以在控制台下執行Stat AI命令
打開控制台輸入框方法
在PC上按 ` 快捷鍵 ,手機上四指在屏幕上同時按下
Stat XXX // 按平行結構展示統計項
Stat XXX+ // 按層次樹結構展示統計項
一些統計項解釋
GT:Game Thread
RT:Render Thread
AT:Any Thread
TTF:True Type(TTF)字體資源
OTF:Open Type(OTF) 字體資源
Stat None
關閉所有統計數據的顯示
對於Stat xxx命令,執行一次會開啟xxx,再執行一次會關閉xxx
Stat fps // 顯示每秒幀數(FPS)計數器
顯示當前平均幀率和每幀平均繪制時長
平均幀率由全局變量float GAverageFPS來計算,GAverageFPS = 1000.f / GAverageMS 詳見:CalculateFPSTimings函數
當前幀平均繪制時長由全局變量float GAverageMS(GameThread執行時間和Waiting時間之和)來計算
上面的設置是針對游戲的,修改后配置會保存在DefaultEngine.ini的如下標簽中
[/Script/Engine.Engine] bSmoothFrameRate=True MinDesiredFrameRate=38.000000 SmoothedFrameRateRange=(LowerBound=(Type=Inclusive,Value=21.426044),UpperBound=(Type=Exclusive,Value=74.614174))
對於編輯的場景(EWorldType::Editor)或PIE游戲(EWorldType::PIE),會保存在DefaultEngine.ini的如下標簽中
[/Script/UnrealEd.EditorEngine]
bSmoothFrameRate=True SmoothedFrameRateRange=(LowerBound=(Type="ERangeBoundTypes::Inclusive",Value=8),UpperBound=(Type="ERangeBoundTypes::Inclusive",Value=110))
關掉Smooth Frame Rate,能獲得精確的測量值,不然它會強行限幀到Min{SmoothedFrameRateRange}~Max{SmoothedFrameRateRange},導致瞬間峰值過濾掉。
Stat UNIT
Android Standalone(Windows)
邏輯詳見:UnrealEngine\Engine\Source\Runtime\Engine\Private\UnrealClient.cpp的FStatUnitData::DrawStat函數
Frame:一幀游所花費的總時間。由於Game線程和Draw線程在完成一幀之前保持同步。Frame = MAX{Game, Draw, GPU}
Game:GameThread線程一幀耗費的時間(去掉了GameThread的Waiting那部分時間)。如果幀時接近Game線程中顯示的時間,則游戲的性能很可能會受到Game線程的阻礙(負面影響)。
Draw:RenderThread線程一幀耗費的時間(去掉了RenderThread的Waiting那部分時間)。如果幀時接近Draw線程中顯示的時間,則游戲的性能很可能會受到渲染線程的阻礙
RHIT:RHIThread線程一幀耗費的時間(當使用獨立的RHIThread才顯示該項;去掉了RHIThread的Waiting那部分時間)。通常,RHI線程時間會被同步到幀上,因此它很可能與幀時相同。
注:以上都執行了A = 0.9 * A +0.1 * Cur算法,進行了平滑
Mem:VMRSS,Resident Set Size 實際使用物理內存(包含共享庫占用的內存)
Draws:DrawCall數 數值來自於int32 GNumDrawCallsRHI變量
Prims:圖元個數 數值來自於int32 GNumPrimitivesDrawnRHI變量
GPU:GPU渲染一幀時間。GPU時間用來衡量顯卡渲染場景需要多長時間。由於GPU時間會被同步到幀上,它很可能與幀時相同。
DynRes:動態分辨率。如果支持(並啟用),DynRes 將顯示主要屏幕百分比和次要屏幕百分比。
Android平台不顯示GPU統計項,可通過如下方式來開啟:
① 注釋掉SupportsDisjointTimeQueries函數
② 在UnrealEngine\Engine\Config\BaseDeviceProfiles.ini中開啟r.DisjointTimerQueries
[Android DeviceProfile] DeviceType=Android +CVars=r.DisjointTimerQueries=1
Stat UnitMax
Android Standalone(Windows)
每一行最后數值為最近200次采樣中的最大值
Mem行第一個值為VmRSS(進程當前使用的物理內存的大小);第二個值為VmHWM(進程所使用的物理內存的峰值)
VMem行第一個值為VmSize(進程當前使用的虛擬內存的大小);第二個值為VmPeak(進程所使用的虛擬內存的峰值)
Stat UnitTime / Stat UnitGraph
Android:在Stat Unit基礎上,添加了左上角實時繪制出Frame、Game、Draw、RHIT曲線的功能
Standalone(Windows):在Stat Unit基礎上,添加了左下角實時繪制出Frame、Game、Draw、GPU曲線的功能
Stat Raw // 未過濾數據的Stat UnitGraph
Stat Detailed // 功能等價於Stat fps + Stat UnitMax + Stat UnitTime / Stat UnitGraph
Android
Standalone(Windows)
Stat AI // 顯示感知系統和整體AI的性能信息
Stat Al_EQS // 顯示環境查詢系統(EQS)的性能、調試和內存統計數據
Stat AICrowd // 顯示群集管理器的性能和步驟信息
Stat Anim // 顯示每次tick蒙皮網格體需要多長時間進行計算
注1:默認一個Group最多顯示的行數為25,可通過執行控制台變量stats.MaxPerGroup xx來指定新的最大行數為xx
注2:為了能查看顯示不下的內容,自定義開發了stat scroll控制台命令
stat scroll 1 // 向下滾動1行
stat scroll -1 // 向上滾動1行
stat scroll 999 // 滾動到底部
stat scroll -999 // 滾動到頂部
stat scroll restore //恢復初始
Stat Anim+ -ms=0.001 // 按層次樹形式展示
Stat AsyncLoad // 顯示異步加載的性能統計數據 注:默認不開啟,需手動開啟
Stat AsyncLoadGameThread
Stat AsyncIO
Stat Audio // 音頻統計數據,如聲波實例或緩沖區性能
Stat AudioStreaming
Stat AudioThreadCommands
Stat Canvas // 畫布統計數據,顯示畫布用戶界面項(例如圖塊、邊框和文本)的性能信息
Stat Chaos
Stat Character
Stat Collision // 顯示碰撞的性能、調試和內存信息
Stat CollisionTags
Stat ColorList
Stat CommandListMarkers // 顯示命令列表及命令性能信息
Stat Component // 顯示組件列表及組件性能信息
Stat Compression // 顯示壓縮統計數據
Stat CrunchMemory
Stat CPULoad // 顯示CPU利用率
Stat CPUStalls // 顯示有關CPU停轉的信息
Stat D3D11RHI // 顯示Direct3D 11 RHI統計數據
Stat DDC // 顯示派生數據緩存(DDC)統計數據
Stat Engine // 顯示一般渲染狀態,例如幀時間,以及正在渲染的三角形數量的計數器
Stat Foliage
Stat Game // 提供有關各個游戲Tick需要多長時間的反饋
Stat Game+ -ms=0.001 // 按層次樹展示
Stat GameplayTags // 顯示游戲進程標簽信息
Stat GC // 顯示垃圾回收統計數據
Stat GeometryCache // 顯示幾何體緩存系統的性能和內存統計數據
Stat GPU // 顯示幀的GPU統計數據 注:android平台上沒有輸出
Stat GPUParticles // 顯示GPU粒子的性能信息
Stat GPUSkinCache
Stat IMEWindows // 顯示Windows文本輸入法系統的信息
Stat InitViews // 顯示有關可見性剔除花費了多長時間以及效果如何的信息。可見分段計數是渲染線程性能方面最重要的一個統計量,它由STAT INITVIEWS下的可見靜態網格體元素控制;不過,可見動態原語也有影響
Stat InitViews+ -ms=0.001 // 按層次樹形式展示
Stat KismetCompiler // 顯示Kismet編譯器信息
Stat KismetReinstancer // 顯示Kismet Reinstancer信息
Stat Landscape
Stat LEVELS // 顯示level streaming信息
關卡顏色代碼說明
綠色:關卡已加載並可見。
紅色:關卡已卸載。
橙色:關卡正在變成可見的過程中。
黃色:關卡已加載,但不可見。
藍色:關卡已卸載,但仍駐留在內存中,當發生垃圾回收時將清除它。
紫色:關卡是預加載的。
Stat LightRendering // 提供有關渲染光照和陰影需要多長時間的反饋
Stat LinkerCount // 顯示linker計數器
Stat LinkerLoad // 顯示linker加載信息
Stat LLM // 顯示低級內存追蹤器(LLM)計數器
Stat LLMFULL // 顯示整個LLM計數器組
Stat LLMOverhead // 顯示LLM開銷計數器
Stat LLMPlatform // 顯示LLM平台計數器
Stat LoadTime // 顯示加載時間性能信息
Stat LoadTimeVerbose
Stat MapBuildData // 顯示地圖的編譯數據
Stat MathVerbose // 顯示數學運算的性能信息
Stat Media
Stat Memory // 顯示有關虛幻引擎中各個子系統使用多少內存的統計數據
Session Frontend中Profiler里面Group Name為Memory的統計細項如下:
統計項類型:
為hierarchy類別,可以嵌套子節點,包含CallCount、InclusiveTime、ExclusiveTime等字段
為int或float數字類型
為Memory類型
Stat MemoryAllocator
Stat MemoryPlatform // 顯示內存平台信息
Stat MemoryStaticMesh // 顯示有關靜態網格體的內存統計數據
Stat NamedEvents // 為外部分析器啟用指定事件
Stat Navigation // 顯示導航系統的性能和內存信息
Stat NET // 顯示網絡系統統計數據
Stat Niagara
Stat NiagaraOverview
Stat object // 顯示對象內存和性能信息
Stat ObjectVerbose // 默認是關閉的 需手動開啟
Stat Online // 顯示在線系統計數器
Stat Packet
Stat PakFile // 顯示Pakfile系統統計數據
Stat ParallelCommandListMarkers // 顯示並行命令列表及並行命令性能信息
Stat PARTICLES // 顯示粒子系統性能信息
Stat ParticleMem
Stat Physics // 顯示物理性能統計數據
Stat PhysXTasks // 顯示PhysX任務信息
Stat PhysXVehicleManager // 顯示PhysX載具管理器的統計數據
Stat PlayerController // 顯示玩家控制器性能信息
Stat PSCWorIdMan
Stat Quick // 快速顯示總體性能數據組
Stat RDG
Stat RenderTargetPool // 顯示渲染目標池的內存和性能統計數據
Stat RenderThreadCommands // 列出渲染線程命令及性能信息,找出耗時較高的Comand
Stat RHI // 顯示RHI內存和性能統計數據
Stat RHICMDLIST // 顯示RHI命令列表及性能統計數據
Stat SceneMemory // 顯示場景內存計數器
Stat SceneRendering // 顯示一般渲染統計數據。這是一個很好的起點,可以發現渲染過程中性能低下的一般方面
Stat SceneUpdate // 顯示有關更新場景的信息,包括添加、更新和刪除光源以及添加和刪除場景中的原語所花費的時間
Stat SCRIPT // 顯示腳本統計數據
Stat ShaderCompiling // 顯示着色器編譯信息
Stat PipelineStateCache
Stat Shaders // 顯示着色器壓縮統計數據
Stat ShadowRendering // 顯示陰影計算花費多長時間,該時間不同於 stat LightRendering 中包括的實際陰影渲染時間
Stat ShadowRenderingVerbose
Stat Slate // 顯示Slate性能統計數據
Stat SlateVerbose // 默認不開啟,需手動開啟
Stat SlateMemory // 顯示Slate內存計數器
Stat SoundCues // 顯示活動的Sound Cue
Stat SoundMixes // 顯示活動的SoundMix
Stat SoundModulators // Shows modulator debug info as provided by active audio modulation plugin
Stat SoundModulatorsHelp // Shows modulator debug help provided by active audio modulation plugin
Stat SoundReverb // Shows active SoundReverb
Stat Sounds // <sort=class l distance l name l prioritytime l volume l waves> <-debug> shows all active sounds. Displays value sorted by when sort is set // 顯示活動的SoundCue和SoundWave
Stat SoundWaves // 顯示活動的SoundWave
Stat splitscreen // 顯示分屏信息
Stat StatSystem // 顯示統計系統的性能和內存信息
Stat Streaming // 顯示流送資源的基本統計數據,例如使用了多少內存流送紋理,或者場景中有多少流送紋理。
Stat StreamingDetails // 有關流送的更詳細的統計信息,例如將一般紋理流分解為更具體的組(光照貼圖、靜態紋理和動態紋理)
Stat StreamingDetailsVerbose
Stat StreamingOverview // 顯示流送資源的統計數據概述
Stat Summary
Stat TargetPlatform // 顯示目標平台信息
Stat TaskGraphTasks // 顯示TaskGraph任務的性能數據
Stat Text // 顯示文本的性能統計數據
Stat TextureGroup // 顯示紋理組內存計數器
Stat TexturePool
Stat Threading // 顯示線程處理信息
Stat ThreadPoolAsyncTasks // 顯示ThreadPool Async任務計數器
Stat Threads // 顯示線程信息
Stat Tickables // 顯示Tickable的性能統計數據
Stat TickGroups // 顯示Tick組的性能統計數據
Stat Timecode
Stat UI // 顯示UI性能信息
Stat UObjectHash // 顯示散列的UObject信息 默認不打開,需手動開啟
Stat uobjects // 顯示游戲中UObject的性能統計數據
Stat Version
Stat VirtualTextureMemory
Stat VTP
Stat AndroidCPU
CPU共有3個Group:
Group 0:有4個核心 Max frequency Ave:2841600.00
Group 1:有3個核心 Max frequency Ave:2419200.00
Group 2:有1個核心 Max frequency Ave:1804800.00
Stat OpenGLRHI
Stat MetalRHI
Stat VulkanMemoryRaw
Stat VulkanMemory
Stat VulkanPSO
Stat VulkanRHI
Stat D3D12RayTracing
Stat D3D12RHI
Stat D3D12Memory
Stat D3D12PipelineState
Stat D3D12DescriptorHeap