中EN
概念页

UE5 性能分析

UE5 Profiling

更新于 2026-10-15 约 11 分钟UE5性能分析UnrealInsightsstatGPUprofilegpu瓶颈

UE5 性能分析的基本流程是:先用 stat unit 判断瓶颈在游戏线程、渲染线程还是 GPU,再用对应的 stat 组、profilegpu/GPU 统计或 Unreal Insights 的 Timing/Memory 等视图向下钻取;渲染特性(RDG、VSM、TSR)各自提供作用域和可视化。测量时要避开会扭曲数据的设置(调试构建、异步计算、可视化模式)。

第一步:定位瓶颈线程

stat unit 显示 Frame、Game、Draw、GPU、RHIT、DynRes。游戏线程和渲染(Draw)线程在一帧结束前会同步,所以 Frame 往往接近其中之一:Frame≈Game 说明受游戏线程限制,Frame≈Draw 说明受渲染线程限制;GPU 时间与帧同步,可能接近 Frame。应在非调试构建中测量。(Stat Commands) 图形编程概览补充:"GPU 时间包含空闲时间,只有当它最长且独立突出时才是瓶颈"。(Graphics Programming Overview)

下图是据此整理的排查流程:

flowchart TB
    A[stat unit] --> B{"Frame 最接近?"}
    B -- Game --> G["stat game / TickGroups / Dumpticks<br/>Insights 看游戏线程轨道"]
    B -- Draw --> D["stat InitViews / SceneRendering<br/>可见元素数、绘制调用"]
    B -- GPU --> P["stat gpu / profilegpu<br/>RDG 作用域、特性可视化"]
    G --> I["Unreal Insights 深入"]
    D --> I
    P --> I

这与 渲染瓶颈定位与性能度量 的方法一致:先找出最慢的阶段,再在该阶段内二分定位;三条线程的流水线背景见 UE5 渲染架构 与 多线程渲染与任务系统,目标预算见 帧时间预算与渲染性能。

常用 stat 命令

在 PIE 控制台输入 stat <名称>:(Stat Commands)

命令用途
Unit / UnitGraph帧、游戏、渲染、GPU、RHI 线程时间(及曲线)
FPS帧率
Game、TickGroups、Tickables、DumpticksGameplay Tick 耗时、Tick 组统计、导出 Tick 函数信息(Tick 机制见 委托与 Tick 机制)
InitViews可见性剔除耗时与效果;"可见区段数是影响渲染线程性能最重要的单一指标"
SceneRendering通用渲染统计,查找渲染慢点的好起点
LightRendering、ShadowRendering光照与阴影耗时
GPU本帧 GPU 统计
RHIRHI 内存与性能统计
GC垃圾回收统计(见 垃圾回收与对象生命周期)
Memory、LLM各子系统内存、低级内存追踪
Streaming、AsyncLoad、Levels纹理流送、异步加载、关卡流送状态
Hitches / DumpHitches超过 t.HitchFrameTimeThreshold 的卡顿写入日志
StartFile / StopFile采集 .uestats 文件供 Session Frontend 分析;务必 StopFile,否则会持续写盘

InitViews 的那条说明对应 绘制调用与状态切换优化:渲染线程的成本主要随可见网格元素数(绘制调用数)增长。(Stat Commands)

Shader Complexity 与材质指令热度

视口模式 Shader Complexity(快捷键 Alt+8,控制台 viewmode shadercomplexity)按估算的着色器指令数给每个像素上色,用来看底场景是否友好,以及粒子短时大量 overdraw 造成的尖峰。(Shader Complexity (from Viewport Modes))

颜色大致含义说明
绿 → 红近似线性:很便宜 → 贵
粉 / 白相对红再跳一档:非常贵;小块白可接受,大面积亮红/白则帧率差

官方 caveat:只看指令数——同样 16 条,全是纹理采样通常比全是算术更慢;未展开的循环(尤其顶点着色器)也反映不准;但对绝大多数情况仍是有用指标。颜色表 +ShaderComplexityColors 在 BaseEngine.ini;MaxPixelShaderAdditiveComplexityCount 默认 2000(可在项目 DefaultEngine.ini 覆盖),ES3 预览默认 800。(Shader Complexity (from Viewport Modes))

与材质轨的关系:Custom 材质表达式 会阻止常量折叠、容易推高指令数;改完 Custom 或复杂节点图后应用此视图对照。翻译与折叠机制见 材质图到 HLSL 的翻译。同页还有 Light Complexity、Buffer Visualization(Base Color / Metallic / Roughness / World Normal 等)便于拆材质输入。(Shader Complexity (from Viewport Modes))

GPU 分析

  • profilegpu(Ctrl+Shift+;)测量当前视图的 GPU 计时,结果显示在弹出界面或日志中;可以按绘制事件名在代码中搜索对应实现。(Graphics Programming Overview)
  • RDG 提供作用域:RDG_EVENT_SCOPE(RenderDoc、RDG Insights 等外部工具可见)、RDG_GPU_STAT_SCOPE(进入 stat gpu)、RDG_CSV_STAT_EXCLUSIVE_SCOPE(CSV 分析器);自研渲染特性应加上它们。(Render Dependency Graph)
  • 异步计算会让分通道 GPU 计时不可靠:VSM 文档建议分析时用 r.RDG.AsyncCompute 0,但绝不能在发行版中关闭;并提醒 stat gpu 等统计在 CPU 瓶颈时可能不可靠。(Virtual Shadow Maps)
  • vis/VisualizeTexture 查看渲染目标;DumpGPU 把多帧中间资源转储到磁盘,适合分析 TSR 等跨帧问题。(Graphics Programming Overview)、(Temporal Super Resolution)
  • 特性自带统计:VSM 页统计(r.ShaderPrintEnable 1 + r.Shadow.Virtual.Stats 1)、stat tsr。分析前要关掉可视化模式,它们本身有可测量的开销。(Virtual Shadow Maps)、(Temporal Super Resolution)

关于 GPU 侧的占用率、调度等底层原因,见 GPU 计算调度与占用率。

GPU Visualizer 与 GPU 崩溃排查(UE 5.0 资料):ProfileGPU(或 Ctrl+Shift+逗号)打开 GPU Visualizer,显示一帧快照中每个渲染通道的耗时;因为是快照,每次改场景后要重新抓。GPU 崩溃(D3D 设备丢失、DXGI_ERROR_DEVICE_HUNG)时 CPU 调用栈不指向真正原因,应分别用 -gpucrashdebugging 或 -d3ddebug 启动(不要同时用);常见原因有显存耗尽、TDR 超时(Windows 默认 2 秒)、引擎/驱动/系统 bug。排查引擎 bug 可用 -onethread -forcerhibypass、r.RDG.Debug=1、r.RDG.ImmediateMode=1(调用栈更有意义,但会改变行为,可能误导),切换 DX11/DX12,逐个开关 Lumen、Nanite、光追等特性。光追 GI/反射可用 r.RayTracing.*.RenderTileSize 分块提交以避免 TDR。(Performance, Profiling and Debugging — GPU Visualizer (Epic course, Michael Muir, Staff),Epic 员工课程,标注 UE 5.0)

注:UE 5.8 和 4.27 的 GPU Profiling 文档页都重定向到首页,未能抓取。上面资料基于 UE 5.0,5.6 起 GPU 分析器的界面和输出有变化(社区资料提到,未经官方文档核实),以当前版本实际输出为准。

Unreal Insights

Unreal Insights 是"能以高数据率捕获项目事件的遥测采集与分析套件",由三部分组成:埋点的跟踪事件 (Trace Events)、在后台记录并保存跟踪的 Unreal Trace Server(监听 1981 端口,单实例、对性能影响很小)、负责分析与可视化的 Unreal Insights 界面。跟踪文件为 .utrace,自描述、跨引擎版本兼容;支持实时连接正在运行的游戏或编辑器。(Unreal Insights)

flowchart LR
    G["游戏/编辑器进程<br/>Trace 埋点"] -->|TCP 1981| S[Unreal Trace Server<br/>Recorder + Store]
    S --> F[(".utrace 文件")]
    F --> U["Unreal Insights 界面"]
    S -->|Live| U

主要分析视图:(Unreal Insights)

视图用途
Timing InsightsCPU 与 GPU 轨道、帧面板、计时器与计数器、调用者/被调用者
Memory Insights追踪每次分配/重分配/释放并重建内存使用,带调用栈
Networking Insights网络流量分析与调试
Slate InsightsUI(Slate/UMG)更新的根因
Asset Loading Insights资产加载耗时、包加载顺序、异步加载优先级是否被遵守
Cooking / Audio Insights烘焙耗时;运行时音频

渲染相关的跟踪通道:RDG Insights 用 -trace=rdg,defaults 采集,可查看资源生命周期、异步计算重叠、被剔除的通道、瞬态内存布局(数据量很大);VSM 用 trace.enable counters,vsm 在 Counters 页查看高级统计。(Render Dependency Graph)、(Virtual Shadow Maps)

取舍与常见坑

  • stat 命令即开即看,适合粗定位;Insights 有完整时间线和调用栈,适合定位卡顿 (Hitch) 和跨线程等待,但需要采集和离线分析。
  • 在调试构建、编辑器视口、开着可视化模式时测得的数据都会失真;结论应在接近发行配置的构建上复核。(Stat Commands)、(Virtual Shadow Maps)
  • 时间性特性(TSR)的画质与帧率挂钩,CPU 瓶颈也会降低画质,所以"GPU 不忙"不等于"画面没问题"(见 TSR 与抗锯齿方案)。(Temporal Super Resolution)
  1. Stat Commands UE 5.8 文档
  2. Unreal Insights UE 5.8 文档
  3. Graphics Programming Overview UE 5.8 文档
  4. Render Dependency Graph UE 5.8 文档
  5. Virtual Shadow Maps UE 5.8 文档
  6. Temporal Super Resolution UE 5.8 文档
  7. Performance, Profiling and Debugging — GPU Visualizer (Epic course, Michael Muir, Staff) Epic 员工课程,UE 5.0
  8. Shader Complexity (from Viewport Modes) UE 5.8 Viewport Modes

相关页面

图形学渲染瓶颈定位与性能度量Bottleneck Location & Performance Measurement渲染管线中最慢的阶段(瓶颈)决定整体吞吐量。优化就是"找到瓶颈 → 优化到瓶颈转移 → 重复",并让非瓶颈阶段做到与瓶颈同样多的工作以换取画质。定位靠逐阶段增减负载的实验和性能工具;度量要用毫秒帧时间而不是 FPS。两条箴言:了解你的架构 (KNOW YOUR ARCHITECTURE);测量、测量、再测量。综合帧时间预算与渲染性能Frame Budget & Rendering Performance本页把 wiki 中分散在 RTR4 第 18~23 章的性能知识串成一条线:一帧的时间预算由最慢的管线阶段决定,先用毫秒帧时间度量并定位瓶颈,再按瓶颈所在位置——CPU/驱动、几何、像素、带宽/内存——选用对应手段;最后从 GPU 硬件机制(占用率、HiZ/early-z、压缩、分块架构)理解这些手段为何有效。各结论的细节与出处见所链接的概念页。游戏开发多线程渲染与任务系统Multithreaded Rendering & Task SystemsCPU 时钟频率约在 2003 年停在 3.4 GHz 附近后,性能来自多核。应用阶段的优化一是让代码与内存访问更缓存友好,二是利用多核:多处理器流水线(时间并行,提高吞吐但增加延迟)、并行处理(空间并行,延迟更低)以及两者结合的任务系统;图形 API 用命令缓冲让多个线程并行录制绘制命令,新一代 API(DirectX 12、Vulkan、Metal)把更多责任交给应用以降低驱动开销。图形学绘制调用与状态切换优化Draw Calls & State Change Optimization调用图形 API 的开销主要在 CPU 端的驱动里:状态切换昂贵,每次绘制调用有固定开销,大量小批次会让 GPU"饿死"。对策是:合理放置缓冲;按状态代价排序分组;共享纹理和着色器;合并网格和实例化以减少调用;并用一个整数排序键同时兼顾状态分组与前后排序。图形学GPU 计算调度与占用率GPU Compute Scheduling & OccupancyGPU 用大量统一的 ALU 以 SIMD/SIMT 方式锁步执行着色程序,ALU 与寄存器文件、L1、本地数据存储、纹理单元等组成多处理器 (MP),由硬件 warp 调度器零开销地切换 warp 以隐藏纹理和内存访问的长延迟。能同时驻留的 warp 数受寄存器等资源限制,用占用率衡量;占用率低会妨碍延迟隐藏,但过高也可能抖动缓存。本页还讨论像素按 quad 调度和 GPU→CPU 回读延迟。游戏开发 · UE5UE5 渲染架构UE5 Rendering ArchitectureUE5 的渲染器是独立的 Renderer 模块,在渲染线程 (Rendering Thread) 上以「场景代理」镜像游戏线程的组件状态,每帧按固定顺序执行深度预通道、G-buffer 基础通道、光照、雾、半透明和后处理。现代渲染代码用渲染依赖图 (Render Dependency Graph, RDG) 声明通道与资源,由 RDG 自动排屏障、复用瞬态内存、并行录制;最终命令经 RHI 线程翻译成 D3D12/Vulkan 等图形 API 调用。默认走延迟着色 (Deferred Shading),也可切换前向着色 (Forward Shading)。游戏开发 · UE5虚拟阴影贴图Virtual Shadow Maps虚拟阴影贴图 (Virtual Shadow Maps, VSM) 是 UE5 默认的阴影方法:概念上就是分辨率极高(虚拟 16k×16k)的阴影贴图,切成 128×128 的页 (Page),只为屏幕上需要着色的像素分配和渲染页,并跨帧缓存;方向光用 clipmap 覆盖大范围,软阴影由阴影贴图光线追踪 (Shadow Map Ray Tracing, SMRT) 生成。它为 Nanite 设计,与 Nanite 一起使用时最高效。游戏开发 · UE5TSR 与抗锯齿方案Temporal Super Resolution & Anti-AliasingUE5 提供四种抗锯齿:时间超分辨率 (Temporal Super Resolution, TSR,默认)、时间抗锯齿上采样 (TAAU)、快速近似抗锯齿 (FXAA) 和仅前向渲染可用的多重采样抗锯齿 (MSAA)。TSR 是与平台无关的时间性上采样器,用低内部分辨率渲染,借助历史帧累积细节输出接近原生的画面,把节省的 GPU 时间留给 Nanite 与 Lumen。游戏开发 · UE5Nanite 虚拟化几何体Nanite Virtualized GeometryNanite 是 UE5 的虚拟化几何体 (Virtualized Geometry) 系统:导入时把网格切成分层的三角形簇 (Cluster),渲染时按相机视角逐簇选择细节层次并无缝拼接,按需从磁盘流送,并在绕过传统绘制调用 (Draw Call) 的独立通道中渲染,使帧预算不再受多边形数、绘制调用和网格内存约束。游戏开发 · UE5Lumen 全局光照与反射Lumen Global Illumination & ReflectionsLumen 是 UE5 默认的全动态全局光照 (Global Illumination, GI) 与反射系统:先做屏幕空间追踪,未命中再对"Lumen 场景"做软件光追(有符号距离场)或硬件光追,命中点的光照从按网格离线放置的卡片 (Card) 构成的表面缓存 (Surface Cache) 中查询,表面缓存的直接与间接光照分摊到多帧更新,从而得到无限次漫反射弹射和全粗糙度范围的反射。游戏开发 · UE5委托与 Tick 机制Delegates & TickUE 有两种驱动游戏逻辑的方式:事件驱动——委托 (Delegate) 在某事发生时回调绑定的函数;轮询驱动——Tick 每帧(或按最小间隔)调用 Actor/组件的更新函数,并按 Tick 组 (Tick Group) 与物理模拟排序。官方建议能用定时器、委托就不用 Tick,必须 Tick 时用 Tick 组和 Tick 依赖保证顺序,避免“差一帧”问题。游戏开发 · UE5垃圾回收与对象生命周期Garbage Collection & Object LifecycleUE 用标记-清除式的可达性分析管理 UObject 内存:从根集合 (Root Set) 出发沿反射可见的强引用遍历对象图,找不到的对象在下次垃圾回收 (Garbage Collection, GC) 时被删除。因此“谁持有 UPROPERTY 引用”决定了对象活多久;Actor 调用 Destroy() 只是请求销毁,真正释放仍取决于引用是否全部放开。游戏开发 · UE5Niagara 粒子系统Niagara VFX SystemNiagara 是 UE5 的 VFX 系统,由系统 (System) → 发射器 (Emitter) → 模块 (Module) 的栈式结构组成:发射器按 Emitter Spawn/Update、Particle Spawn/Update、Event、Render 分组,模块是自上而下执行、基于 HLSL 的「读-算-写」单元。继承、动态输入、事件和数据接口 (Data Interface) 提供复用与外部数据访问;发射器可选 CPU 或 GPU 计算着色器模拟。官方 5.8 文档未找到 CPU/GPU 对比页,相关取舍按通识标注。游戏开发 · UE5UMG、Slate 与 Common UIUMG, Slate & Common UISlate 是 UE 平台无关的 C++ 声明式 UI 框架(编辑器即用它构建),UMG 是在其之上的可视化控件蓝图层(UE 5.8 API:UWidget 是所有暴露给 UObject 的被包装 Slate 控件的基类),Common UI 插件再在 UMG 之上补充多层界面、输入路由、手柄导航、平台按键图标和样式资产。官方 UMG 最佳实践强调事件驱动更新而非绑定/Tick、固定分辨率与 DPI 制作、用 Scale Box 而非 Render Transform 做永久缩放。游戏开发 · UE5移动端渲染优化Mobile Rendering Optimization移动端优化的核心是认清设备的 CPU/GPU 速度、线程、带宽和内存,然后控制最主要的几项开销:Draw Call(官方称其为当前导致图形性能低下的最大因素,在 Galaxy Tab S6 上建议约 700 个,低端设备少于 500 个)、材质复杂度和 overdraw。合并网格和材质(Substance 把多种材质画进同一张纹理,用顶点色作遮罩)是减少 Draw Call 最直接的办法。游戏开发 · UE5Gameplay 调试器与可视化日志Gameplay Debugger & Visual LoggerGameplay 调试器 (GDT) 用于在运行时实时查看玩法数据(Pawn、AIController、行为树与黑板、EQS、感知、导航网格),联网时客户端也能看,并且只复制已启用类别的数据。可视化日志 (Visual Logger) 则把 Actor 的状态和图形化信息录下来,之后在编辑器里按时间轴来回拖动查看,适合排查难以复现的 bug。游戏开发 · UE5任务系统Tasks SystemUE::Tasks 是 UE5 的任务级并行库,是对 TaskGraph 的改进,与 TaskGraph 共用同一套调度器和工作线程。它支持启动任务、等待或取结果、声明前置依赖、嵌套任务、管道 (Pipe) 和任务事件。官方建议用依赖关系把工作连成图,而不是阻塞等待;5.5 起用「超额订阅」取代了容易死锁的忙等待。游戏开发构建配置与编译优化Build Configurations & Compiler OptimizationC++ 游戏代码从源文件到可执行文件要经过预处理、编译、链接。游戏项目通常不止 Debug/Release 两种构建配置 (build configuration),而是 Debug、Development、Ship,有时再加混合构建;配置越多测试越难。编译器优化分为局部优化和全局优化(链接时优化 LTO、剖析引导优化 PGO),它们让程序更快,但也让调试器“说谎”。所以要学会调试优化过的构建,并用统计式或插桩式性能分析器 (profiler) 找出最耗时的代码。游戏开发游戏内性能与内存剖析In-Game Profiling & Memory Tracking游戏是实时系统,要保持 30 或 60 FPS,同时受目标硬件内存限制。第三方剖析工具有局限、在主机上未必可用,所以许多引擎自带游戏内剖析器(手动插桩的代码块计时、层级关系、调用次数、导出 CSV)和内存统计与泄漏检测工具。GEA 讲解它们的实现要点和常见限制。(卷 I 10.8–10.9 节)图形学渲染开发与 GPU 调试工具Rendering Development & GPU Debugging Tools渲染引擎的运行时部分只是拼图的一块,还需要一批离线工具来制作内容、优化性能、诊断问题。GEA 介绍了四类:数字内容创作 (DCC) 工具、材质编辑器、资产调理管线,以及 PIX、Razor GPU 这样的 GPU 帧捕获、检查和回放工具(GEA4 卷 II 12.9)。游戏开发 · UE5材质系统Material SystemUE 材质 (Material) 是用节点图描述「表面如何与光交互」的着色器生成器。它有三个正交维度:着色模型 (Shading Model) 决定光照模型(Default Lit、次表面、清漆、毛发等),混合模式 (Blend Mode) 决定与背景的合成公式(Opaque/Masked/Translucent…),参数 + 材质实例 (Material Instance) 让美术在不重编译着色器的前提下做变体。PBR 输入(Base Color/Roughness/Metallic/Specular)直接对应 RTR4 的金属度-粗糙度工作流;最大的工程坑是静态参数导致的着色器排列爆炸。游戏开发 · UE5Custom 材质表达式Custom Material ExpressionCustom 节点允许在材质图里直接写 HLSL:任意数量输入、指定输出类型,可选额外输出、define 与外部 .ush/.usf 包含路径。它是「内置节点做不到」时的逃生口;代价是无法常量折叠、输入仅函数局部可见、且必须是合法 HLSL。优先用内置节点与材质函数,只在必要时上 Custom。游戏开发 · UE5材质图到 HLSL 的翻译Material Graph to HLSL Translation材质编辑器点 Apply 之后,引擎先把节点图翻译成 HLSL,再把 HLSL 编译成 GPU 字节码。翻译以 MaterialTemplate.ush 为模板、由 FHLSLMaterialTranslator 做文本替换与常量折叠;内置节点能被折叠,Custom 材质表达式 则不能。每个材质还会按特性/平台/用途生成多份着色器排列。

被这些页面引用1 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原