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\*.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利用率
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 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
// 显示流送资源的统计数据概述
将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