
如果你是一个地编大概遇到过这样的场景手搭的森林关卡在编辑器里飞来飞去都流畅一打包运行帧率直接掉到 20。地图不大角色逻辑不复杂场景物件也不算多可就是肉眼可见地卡。想优化却不知道从哪下手网上搜出来的建议大多是零散的“关掉体积雾”“阴影质量调低”“不要开 Nanite”每一条单独看都像在猜。这正是我写这篇文章的原因。UE5 的 GPU 优化并不玄学它不是靠“感觉”逐项试开关而是一条可以复用的工作流先用工具定位瓶颈再按开销优先级收口最后用同样的工具验证结果。对一个普通地编关卡来说这套流程跑完一小时绰绰有余。读完你会看懂Stat GPU和ProfileGPU的关键数据清楚光照阴影、纹理池、材质 Overdraw、网格体剔除这几类常见开销源怎么处理并拿到一张可以直接照着执行的一小时清单。1. GPU 开销的底层逻辑地编要先建成本账本地编优化卡住的第一个原因不是不会用命令而是没有建立“成本账本”的思维。GPU 渲染一帧画面简单说是这样一条流水线几何体进入显卡经过顶点转换、光栅化成像素再经过着色计算输出颜色期间还要叠加光照、阴影、后处理。对地编来说你不必成为一个渲染工程师但你要知道一件事GPU 每一帧的耗时等于各渲染环节耗时的总和而这些环节里相当一部分是地编可以通过设置改变的。我习惯用一个比喻GPU 每帧有一个预算PC 上通常 16.6 毫秒对应 60 帧主机或高端配置可能放宽到 33.3 毫秒对应 30 帧。地编的工作不是“把画面做到最贵”而是“在预算内把钱花在该花的地方”。地编能控制的 GPU 开销大头主要有四类开销源典型地编操作优化方向光照与阴影摆方向光、点光源开启 Lumen 动态 GI调整 Lumen 质量、阴影距离、级联数量、光源数量材质着色与纹理采样使用复杂材质、大贴图、半透明材质控制纹理尺寸、Mip、Overdraw简化材质复杂度几何体复杂度高模网格、大量植被、超远距离可见的细节Nanite、距离剔除、LOD、HLOD后处理叠加Bloom、AO、体积雾、抗锯齿按平台目标裁剪不必要的后处理另外一个关键误区是不要把 CPU 卡顿和 GPU 卡顿混在一起。如果场景里 Draw Call 数量爆炸CPU 提交渲染指令的速度跟不上这时候怎么调 GPU 选项都没用。地编首先得分清瓶颈在哪再去动对应的开关。2. 先定位瓶颈比“感觉卡”更靠谱的诊断手段我见过太多人凭肉眼判断“卡是因为东西太多”然后删掉一半模型结果帧率只提升两三帧。正确做法是先用引擎自带工具让数据说话。2.1 用 Stat Unit 区分 CPU 与 GPU 瓶颈在编辑器运行关卡按~键打开控制台输入Stat Unit画面上会出现一列实时数据重点看这几项Frame当前帧总耗时单位毫秒是性能最终指标。Game游戏线程逻辑耗时如果偏高说明 CPU 逻辑有问题。Draw渲染线程耗时通常和 Draw Call 数量、提交指令复杂度相关。GPUGPU 渲染耗时这是本文关注的核心。RHITRHI 线程耗时代表图形 API 提交层。如果GPU数值接近Frame说明瓶颈在 GPU继续往下查如果Game很高而GPU不高说明是游戏逻辑或场景加载导致 CPU 卡顿这时去调 GPU 画质选项基本没用。2.2 用 Stat GPU 找到 GPU 里的“大头开销”确认瓶颈在 GPU 后继续输入Stat GPU这是地编最值钱的命令之一。它会列出 GPU 渲染各阶段的耗时例如阴影Shadows、基础着色BasePass、光照Lighting、半透明Translucency、后处理PostProcessing等。哪一项数值最大哪一项就是你先要动手的地方。一个真实场景你做了一片森林打开Stat GPU后发现Lighting和Shadows两项加起来占了 GPU 总耗时一半以上。这时候与其删植被不如先检查方向光的级联阴影距离是不是设到了 8000 甚至 10000再考虑是否真的需要每一帧都跑动态全局光照。方向完全不同收益也完全不同。2.3 用 ProfileGPU 抓单帧热点如果Stat GPU只能看到阶段级信息而你想知道某个具体光源或某个渲染特性花了多少时间可以用ProfileGPU输入命令后引擎会记录当前帧的详细 GPU 耗时并输出到 Output Log。不同 UE5 版本的交互方式略有差异稳妥的做法是把画面停在场景最复杂的视角执行一次ProfileGPU然后打开 Output Log查看带缩进的耗时明细。对地编而言只要能从里面读出“某个光照功能、某个阴影步骤”的异常耗时目的就达到了。我想特别强调一个习惯优化前后用同一段数据对比而不是只凭“感觉流畅了”。后面第 7 章会给一个具体的验证流程。3. 光照与阴影GPU 开销第一大户的优先动刀光照与阴影是 UE5 地编项目里最容易失控的 GPU 开销源。原因是 UE5 默认打开了 Lumen而且方向光默认有比较激进的阴影设置。很多地编项目做的是白天固定时刻的室外场景根本不需要实时动态全局光照但默认设置一直在“支付”这笔费用。3.1 按项目需要调整 Lumen 配置打开项目设置路径是 Edit Project Settings Rendering。Dynamic Global Illumination Method默认可能是Lumen如果项目是固定光照场景可以改成Screen Space甚至None。Reflection Method同样可以从 Lumen 调整为 Screen Space。如果仍然需要 Lumen但画面压力太大可以降低其质量设置。控制台命令也可以直接改相关参数例如r.Lumen.DiffuseIndirect.Allow1 r.Lumen.Reflections.Allow1 r.Lumen.ScreenProbeGather.TargetFrameRate30这里的思路是先用控制台命令验证“关掉/调低某个功能是否能明显改善帧率”。如果答案是可以再回到项目设置里固化这个选择并通知团队。这里容易踩的坑是明明没有会移动的太阳、没有动态时间变化却开着 Lumen 跑满场。从地编角度看真正的收益是你看到更准确的新能源反弹但对大多数固定光照场景来说这种收益远低于它造成的性能支出。3.2 方向光级联阴影先砍距离和级联方向光Directional Light的级别阴影非常贵尤其是在大面积室外场景。选中场景里的方向光 Actor在细节面板中找到 Cascaded Shadow Maps 相关的设置Dynamic Shadow Distance阴影能投射到多远的距离。室外场景设 2000 到 4000 通常已经足够再远玩家根本注意不到却会让 GPU 多算一大部分阴影。Max Cascades级联数量。级联越多近距离阴影越清晰但每一级都在生成一张阴影贴图。Contact Shadow如果项目没有近距离高精度阴影需求尽量保持关闭或谨慎开启。控制台命令也可以快速调整r.Shadow.DistanceScale0.5 r.Shadow.CSM.MaxCascades2注意这两个命令是改全局默认实际项目里应该以方向光组件面板里的参数为准。更好的操作是先记下当前阴影距离数值把它从 8000 改到 3000看Stat GPU中 Shadows 的耗时下降多少再决定是否继续收敛。3.3 点光源与矩形光数量比单个强度更关键洞穴、室内、夜景场景里地编经常摆一堆点光源和矩形光来塑造氛围。每个动态点光源都会增加一次独立的着色贡献如果它开启了阴影还要额外生成动态阴影贴图。一句话建议能用静态光照替代的场景不要用动态光源。对于夜景场景可以用烘焙光照Lightmass或提前计算好的光照贴图来承担氛围动态光源只保留少量真正会动的灯比如手电筒、火把、爆炸火光。GPU 不会因为你调整光源颜色而变快但会因为少一个带阴影的动态光源而明显减压。4. 材质与纹理贴图池、Overdraw 与着色复杂度材质层面的开销不像光照那么显眼但它是地编最常见的隐藏扣分项。很多项目里几十张贴图全是 4K材质节点层层叠叠运行时却又卡又模糊。要理解这里面的原因需要区分“纹理内存”和“纹理采样开销”。4.1 纹理池爆红先看 Pool Size 而不是疯狂压缩贴图运行场景时如果控制台或编辑器底部出现大量关于Texture Streaming Pool的警告说明纹理流送池超预算了。常见误判是把所有 4K 贴图替换成 1K然后发现画面变糊了帧率也没提升多少。真正的问题是你一次性加载了很多大纹理超出了流送池容量导致贴图在显存和内存之间反复换页。查看纹理池用量可以输入Stat Streaming临时增大池子容量可以输入r.Streaming.PoolSize1024但我不建议把这个命令当成最终解法。合理的做法是回到内容侧大物体、镜头停留久、画面占比高的物体用 2K 或 4K远景、角落、一次性出现的装饰物用 512 或 1K 足够。UE5 对纹理 Mip 的自动管理已经做得不错地编要做的是不给它塞超过预算的原始素材。4.2 Overdraw同一个像素被画了好几遍地编新手容易忽略 Overdraw 的杀伤力。简单说Overdraw 指一个像素在一帧里被重复着色的次数。半透明材质、粒子、层叠的树叶、玻璃、水面这些都会造成高 Overdraw。想直观看到它可以在编辑器视图模式中输入ShowFlag.Overdraw 4画面会切换成一张热度图纯白区域说明每像素只画了一遍越红说明画得越多。如果你发现树冠内部、粒子密集区大面积发红那么这些物件才是 GPU 像素单元的“隐形杀手”。对应策略很直接减少全屏粒子的覆盖降低半透明植被的密度不要在大型 UI 或全屏特效里堆叠半透明材质。对移动端项目这条限制要严格得多因为移动 GPU 对 Overdraw 更为敏感。4.3 控制材质着色复杂度材质节点的数量本身不一定导致性能灾难真正影响 GPU 的是材质最终生成的着色器指令数。地编角度的实用原则有几点尽量使用Opaque不透明材质少用Masked遮罩裁剪材质。Masked 需要额外执行裁剪测试高频次在边缘区域采样时成本更高。慎用World Position Offset。带动画的 WPO 会打破引擎对网格体的一些静态优化尤其是在大量植被上更明显。半透明材质按需控制Translucency相关选项尤其是Separate Translucency、体积雾参与等每一项都有 GPU 成本。做一次简单检查把场景里明显耗材质的物件逐个隔离观察Stat GPU中的 BasePass 耗时变化。如果某个材质的反复修改无法显著改变耗时问题往往不在材质节点而在这个材质作用的面数或覆盖面积。5. 网格体与世界构建Nanite 边界、剔除与 HLOD几何体是地编绕不开的话题。UE5 带来了 Nanite很多教程把它描述成“高模随便用”的万能解但地编心里要有一杆秤Nanite 解决的是特定类型几何体的渲染成本问题不是所有场景物件的免费午餐。5.1 Nanite 的适用边界Nanite 是 UE5 的虚拟化几何体系统它能自动管理高密度网格的 LOD让大量静态高模三角形以很低的开销渲染。它适合什么适合高密度静态几何体比如岩石、建筑外壳、雕像、地形细节。它不适合什么适合场景里成片的植被、带骨骼动画的角色、布料、细长枝干、需要频繁位移的物体以及使用半透明明材质或复杂 Masked 材质表现细节的物体。原因在于 Nanite 的虚拟化方案更多面向静态几何和特定渲染管线对这类特殊材质和动画物体的支持与收益有限。不同 UE5 版本对 Masked 植被的支持程度有差异遇到具体项目时不要凭“网上说可以”就批量开启而是用性能工具实测。一个常见误区是给关卡里所有网格体打开 Nanite结果发现帧率不升反降或某些材质显示异常。这通常不是 Nanite 本身有问题而是它用错了对象。判断方法很简单打开Stat GPU看 BasePass 耗时关闭该网格的 Nanite 再对比一次。5.2 距离剔除最便宜的性能提升对地编来说最便宜的优化是“让看不见的东西不进入渲染流程”。关卡里放一个Cull Distance Volume可以按每个 Actor 或每个体积设置剔除距离。比如远景的灌木丛在 1500 单位外就可以完全隐藏背后的山体在 8000 单位外也可以不渲染玩家根本不会察觉。另一种做法是使用 UE5 自带的网格体 LOD 设置。为每个静态网格体合理配置 LOD 距离让远景自动切换为低面数版本。比手动删模型有效得多也不会改变画面构图。5.3 HLOD 与 World Partition 的远距离代理在大型关卡里远距离的完整网格体经常因为合并或代理不当导致额外开销。UE5 的 World Partition 工作流里有 HLOD 机制会自动为远距离区域生成简化代理网格体。对地编来说不用把所有细节都搞懂但要知道一个原则远处场景不需要以完整细节渲染时用更低成本的代理体替代。如果项目还没用 World Partition普通关卡的远距离大物体也可以手动做简化版本或者用引擎的合并工具生成一个低面数代理网格体。这部分工作的性价比通常高于在后期处理或画质选项里反复调参。6. 一小时优化执行清单按时间排序的落地动作如果你现在的关卡已经卡得没法玩下面是按时间排序的落地清单。这套顺序的前提是先用工具确认 GPU 是主要瓶颈再按开销从大到小去动刀。第 0-10 分钟诊断定位打开关卡进入 Lit 视图运行游戏并打开Stat Unit确认 GPU 靠近 Frame。继续打开Stat GPU记录当前最高耗时的前三个阶段比如默认可能是 Lighting、Shadows、BasePass。用手机截图或 Excel 记下数值这是后续验证优化的基准线。第 10-25 分钟光照与阴影收口检查方向光的级联阴影距离从过大的默认值收敛到 3000 左右。检查项目里的 Lumen 设置如果场景不需要动态 GI则改用 Screen Space 或关掉 Lumen重新跑Stat GPU看 Light 和 Shadow 的变化。如果仍然需要 Lumen调低 Screen Probe 相关质量设置。第 25-35 分钟纹理池与材质 Overdraw打开Stat Streaming确认纹理池是否爆红若是先临时用r.Streaming.PoolSize给出更大池子再做内容侧替换。切到ShowFlag.Overdraw 4找一下全场最红的位置优先处理大面积的半透明覆盖、粒子堆叠和高 Overdraw 的树叶区。第 35-45 分钟网格体与距离剔除检查是否有不合理的远景可见网格体放置Cull Distance Volume或调整网格体的LOD距离。确认 Nanite 是否用在了适用对象上如果发现植被或动态物体开了 Nanite 且并未带来收益果断关闭。第 45-55 分钟集中验证不要边改边验证因为每个开关都会影响其它结果。把改完的设置集中成一次验证回到固定的测试视角跑同一段镜头路径重新打开Stat GPU记录数据对比基准线。第 55-60 分钟记录与提交把每一步改动记录到文档说明改了什么、为什么改、帧率变化如何。这些记录不只是给别人看的也是你下个关卡复用的经验库。7. 运行结果与效果验证用数据确认改对了地编性能优化最容易犯的错误是“改完看两眼觉得流畅了”结果打包后又崩回 20 帧。验证方法必须严格建议遵循以下步骤。7.1 固定测试条件选一个画面复杂度覆盖全关卡中位数水平的视角固定镜头位置和方向。如果关卡是走动的就设计一条固定路径从 A 点走到 B 点过程中包含远眺、近景、光源复杂区。录制一段相同的镜头作为后续所有对比的统一样本。7.2 对比优化前后的数据表在同样条件下分别记录Frame、GPU、Shadows、Lighting、BasePass数值。一个合格的优化结果不是某一项降低而是 GPU 总耗时降低同时画面上没有明显视觉回退。下面是一个示意性的对比表格式数值请以自己项目为准指标优化前优化后变化Frame18 ms14 ms提升约 22%GPU17 ms13 ms下降明显Shadows8 ms4.5 ms腰斩Lighting6 ms3 ms下降显著BasePass3 ms3 ms无变化如果某一个环节数据没有变化可能是改动没有生效或者该环节不是主要瓶颈这时不要为了“凑优化”强行去调它。7.3 不要只盯平均帧率平均帧率会掩盖卡顿。更值得关注的是最低帧率或 P95/P99 帧耗时。方法很简单在测试路径中记录几次明显掉帧的区间对比它们是否从“无法接受”变成“勉强可用且不再抖动”。如果 FPS 平均值提升了但最低帧仍然掉到 20说明某个尖峰开销还在需要继续用ProfileGPU定位。另外要注意一个陷阱编辑器里运行和打包运行性能表现经常差异很大。最终验收一定要以打包后的版本为准因为编辑器自身有很多额外开销会掩盖真实渲染成本。8. 常见问题与排查思路地编做优化时经常会遇到一些“改不动”或“越改越糟”的情况下面按表格列出常见问题、可能原因、排查方式和解决方向。问题现象可能原因排查方式解决方案启动运行后 FPS 很低但Stat GPU显示压力不大瓶颈在 CPU 或游戏线程不在 GPU看Stat Unit中的 Game 与 Draw 是否偏高控制 Draw Call、检查蓝图逻辑不要继续调 GPU 选项运行一段时间后出现地形/贴图模糊或弹出纹理流送池超预算输入Stat Streaming查看 Pool 占用减小池子压力替换超大纹理、调整 Mip 设置、清理不必要的大贴图阴影边缘闪烁或出现痤疮级联阴影距离和阴影贴图分辨率设置不合理检查方向光的阴影设置与r.Shadow.CSM.MaxCascades微调阴影距离、级联数量和阴影贴图分辨率避免数值过于极端树冠区域 Overdraw 严重GPU 的 BasePass 偏高大量半透明或高复杂度植被材质输入ShowFlag.Overdraw 4观察热区降低植被密度、使用更简单的材质、降低相关 LOD 距离打开 Nanite 后帧率反而下降Nanite 被用在不适合的对象上检查使用 Nanite 的网格体类型与材质只对高密度静态几何使用 Nanite动植被和特殊材质关闭关掉 Lumen 后画面明显变暗或反射消失项目非常依赖动态 GI 和反射确认项目是否需要实时动态光照如果确实需要 Lumen降低质量参数而非整体关闭或用烘焙光照补充主场景打包版本比编辑器版本卡很多打包版本使用了不同的渲染设置或未烘焙内容检查打包时是否包含完整关卡、光照构建结果是否生效重新构建光照确认打包设置中启用了正确的渲染特性需要说明的是每个项目的表现都不一样排查表给出的是通用路径关键一步永远是先用工具确认“瓶颈在哪”再对症处理。9. 最佳实践与工程建议9.1 为项目建立性能预算表地编团队最常见的混乱是“谁都可以加资源但没人负责总量”。建议在项目里建立一张简单的性能预算表按目标平台填写允许的 GPU 各阶段耗时。以常见的 60 帧目标为例GPU 整体最好不要超过 14-15 毫秒其中阶段预算建议Shadows视场景而定一般控制在 3-4 ms 以内Lighting / GI室温光照场景尽量控制在 3 ms 左右BasePass / 材质根据画面复杂度分配 3-5 msPostProcessing1-2 ms 左右即可这不是硬指标而是一个协调话术。当某个需求会让 Shadows 超过预算时地编就能拿着数据去和策划或 TA 谈可以加但要调整阴影距离或 LOD 策略。没有预算表的项目优化永远是一次性清理撑不了几个版本。9.2 优化要可回滚避免“调参地狱”每次优化改动的开关和参数单独记录并提交不要三个改动混在一起验证。比如这轮只调阴影距离下一轮再改 Lumen 设置。这样如果画面出现问题你知道是哪个改动引入的也方便用版本控制回滚。控制台命令适合快速验证但最终要写进项目设置或对应的 Actor 组件配置否则重启项目后改动全部丢失测试人员拿到的新版本还是卡。9.3 做一个“性能验收视角”供团队共用在关卡里做一个固定朝向的相机书签或测试 Actor专门用来跑性能验证。团队里任何人改动场景资源后都能用统一视角跑一遍数据对比避免“他那边流畅我这里卡”的口水战。这个稳定基线的价值会在项目后期被无限放大。9.4 最后的提醒地编 GPU 优化的核心不是“把画质调到最低”而是让数据告诉你哪些成本是可削减的哪些成本是必须接受的。每次做大型场景前先跑一次Stat GPU记录基准在关键视觉目标光照、材质、远景上做出取舍再让固定视角的性能验收兜底。这套习惯远比临时抱佛脚地搜优化开关可靠。下一步建议从ProfileGPU的详细报告开始深入理解各个 Pass 的名字和含义你会慢慢拥有只凭数值就能判断场景健康程度的能力。