unreal insights是准确定位多线程卡顿根源的唯一手段,必须通过命令行启动追踪(如mygame.exe -trace=default,frame,cpu,gpu,log -tracefile=trace.utrace),禁用冗余通道,使用打包版本,并结合自定义trace_cpuprofiler_event_scope埋点与insights时间线、搜索及细节面板进行精准归因分析。

Unreal Insights 不是用来“看看就完事”的工具,它是唯一能准确定位多线程卡顿根源的手段——尤其当 stat unit 显示 Game 高但你查不到具体函数时。
启动追踪必须用命令行,编辑器里点“Start Tracing”基本无效
编辑器内置的追踪按钮常漏掉关键线程事件(尤其是RHI和GPU提交阶段),且受UI刷新干扰严重。真实项目必须走命令行启动:
-
MyGame.exe -trace=default,frame,cpu,gpu,log -tracefile=Trace.utrace是最低可用组合;log通道务必带上,否则无法把卡顿帧和你的UE_LOG日志对齐 - 不要加
network或audio等冗余通道——它们会显著增大.utrace文件体积,拖慢Insights加载速度 - 目标平台必须是打包后的
Shipping或Development版本,编辑器内运行的数据会混入大量调试开销,参考值失真
在Insights里快速定位AI逻辑卡顿:聚焦 GameThread 时间线+自定义埋点
打开 .utrace 后,默认时间线里 GameThread 的尖刺不等于“你的C++代码慢”,它可能只是引擎内部的Tick调度或GC暂停。真正要盯的是你自己埋的点:
- 在AI行为树执行关键节点前,插入
TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("BT::MoveToTarget"));不要用SCOPED_NAMED_EVENT,它在Insights里不可搜索 - 在Insights顶部搜索框输入
BT::,所有匹配事件会高亮;点击任一事件,右侧Details面板会显示精确耗时、调用栈和所属线程 - 如果发现某个
BT::事件在多个帧里持续 >5ms,说明该节点逻辑存在O(n²)遍历或未做距离剔除——这时再回代码里看GetVisibleEnemies()是否遍历了全部200个敌人
DrawThread 和 RHIThread 高但 GPU 低?大概率是CPU端提交瓶颈
这种现象常见于多敌人场景:明明没画多少东西,Draw 和 RHI 时间却飙升。根本原因不是显卡慢,而是CPU端每帧生成太多Draw Call或频繁切换状态:
- 检查是否每个敌人用了独立
UStaticMeshComponent—— 这会导致逐个提交,而不是合批;改用InstancedStaticMesh可将100个敌人压成1个Draw Call - 确认材质是否启用了
bUseAsOccluder或动态阴影;这些设置会让引擎为每个实例额外跑一次遮挡查询,直接卡死RHIThread - 在Insights的
GPU面板里展开GPU Frame Time,如果GPU时间稳定在8ms但RHI持续20ms,说明问题纯在CPU端提交逻辑,不用动着色器
真正难的不是找到哪个函数耗时高,而是判断“这个耗时是否合理”——比如 AIPerceptionSystem 的 UpdateStimuli 花3ms,对5个敌人合理,对50个敌人就是设计缺陷。Insights只给数据,决策得靠你对AI架构的理解。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











