可可西

UE4打印到HUD的Stat命令

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\*.hUnrealEngine\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.cppFStatUnitData::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利用率

 

CPUTime.Dump命令

CPUTime.Dump -Delay=N   // N在[10,300]之间,统计N秒内游戏跑了多少帧,花费多了多少平均CPU占用率(打印到log中)

CPUTime.Dump -Delay=0   // 关闭统计

CPUTime.Dump -Delay=10  // 统计10s内游戏跑的帧数和花费的平均CPU占用率

LogGenericPlatformTime: Delay set to 10 second(s), started printing the CPU usage
LogGenericPlatformTime: CPU Time for last 1310 frames:   9.8% (156.9%)
LogGenericPlatformTime: CPU Time for last 888 frames:  11.3% (180.3%)
LogGenericPlatformTime: CPU Time for last 886 frames:  11.4% (182.6%)
LogGenericPlatformTime: CPU Time for last 878 frames:  11.3% (181.6%)
LogGenericPlatformTime: CPU Time for last 864 frames:  11.0% (176.1%)
LogGenericPlatformTime: CPU Time for last 866 frames:  11.2% (179.7%)
LogGenericPlatformTime: CPU Time for last 874 frames:  11.5% (184.0%)
LogGenericPlatformTime: CPU Time for last 868 frames:  11.8% (188.2%)
LogGenericPlatformTime: CPU Time for last 620 frames:  10.9% (174.7%)

 

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 FrontendProfiler里面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   

// 显示流送资源的统计数据概述

 

将r.Streaming.PoolSizeForMeshes设为1后(即:1MB),Mesh LOD Bytes Evicted(即:置换出去的内存)逐渐增加,最后稳定后其数值大概为:Mesh LOD Bytes Streamable - 1MB

Mesh LOD Bytes的总内存数为:Mesh LOD Bytes Resident(在内存中的) + Mesh LOD Bytes Evicted(置换出去的内存)

注1:Mesh LOD Bytes Streamable为可以streaming的Mesh LOD内存

注2:Mesh LOD Bytes Resident为没有被置换出的streaming的Mesh LOD内存和最低一级不可置换LOD的Mesh内存

 

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

 

posted on 2021-03-29 12:54  可可西  阅读(3493)  评论(0编辑  收藏  举报

导航