Stat命令(chs en)提供了游戏和引擎各个方面的实时统计信息,输入不同参数会在屏幕HUD上显示对应统计数据。
Debug、Development包才会启用STATS宏,统计逻辑才会编译进可执行二进制中,才能使用Stat命令相关的功能
若想让Shipping和Test包也有Stat命令功能,可在UnrealEngineEngineSourceRuntimeCorePublicMiscBuild.h中将FORCE_USE_STATS宏定义成1
/** Compile flag to force stats to be compiled */ #ifndef FORCE_USE_STATS #define FORCE_USE_STATS 1 #endif
统计相关的所有逻辑在:UnrealEngineEngineSourceRuntimeCorePublicStats*.h和UnrealEngineEngineSourceRuntimeCorePrivateStats*.cpp中
Stat类别定义在:UnrealEngineEngineSourceRuntimeCorePublicStatsStats2.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)
逻辑详见:UnrealEngineEngineSourceRuntimeEnginePrivateUnrealClient.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函数
② 在UnrealEngineEngineConfigBaseDeviceProfiles.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