UE5 特效性能优化:LOD、Culling 和 GPU 粒子的最佳实践
上周三深夜,我的学员老周在群里发了一张截图——他的赛博朋克风格场景在 PC 上跑出了 18 FPS。他用了 400 多个 Niagara 粒子系统,每个系统里都塞满了 5000+ 的粒子,外加 20 多个级联光束。问题很典型:特效美术的“堆料式”制作习惯,在 UE5 的 Nanite 和 Lumen 时代,反而成了性能杀手。
我让他打开 `stat gpu` 和 `stat particles` 面板,结果一目了然:GPU 的 DrawCall 有 60% 来自半透明粒子,而 `Particle Update` 的 CPU 时间占了 11ms。这不是显卡不行,是完全没有做任何性能预算管理。
今天这篇文章,我会用两个实战案例,把 UE5 中特效性能优化的三板斧——LOD、Culling、GPU 粒子——掰开揉碎讲清楚。全程使用 UE5.3.2 版本,Niagara 为内置最新版。
—
一、先搞清楚你的性能瓶颈在哪:三个必开面板
在动手优化前,先学会用工具定位问题。我要求所有学员在场景中按下 `~` 键,依次输入以下命令:
1. `stat gpu` — 查看 GPU 渲染时长,重点看 `PrePass`、`BasePass`、`Translucency` 三段。如果你的 `Translucency` 超过 3ms,说明半透明特效(粒子、光束)过重。
2. `stat particles` — 查看粒子系统的 CPU 和 GPU 更新耗时。这里会列出每个系统的 `Emitter Update` 和 `Particle Spawn` 时间,按降序排列,最耗时的排最上面。
3. `stat RHI` — 查看 DrawCall 数量。记住一个经验值:移动端特效 DrawCall 不超过 50,PC 端不超过 200。超出后,即使 GPU 不累,CPU 也会成为瓶颈。
我让老周把这三个面板截图发我,结合他的场景,我给了他两个优化方案。下面展开讲。
—
二、实战案例一:Niagara 系统的 LOD 与距离 Culling
老周的场景里有一个“全息广告牌”效果,由 8 个 Niagara 系统组成,每个系统包含 3 个发射器,粒子数量在 8000 左右。问题是:无论玩家离广告牌多远,系统都会完整模拟所有粒子。
步骤 1:启用 Niagara LOD(Level of Detail)
在 Niagara 系统编辑器中,点击左上角的 `System Overview` 面板,找到 `LOD` 标签页。这里默认是 `Off`,我们改为 `Auto`。Auto 模式会根据屏幕大小自动切换 LOD 级别。
但 Auto 模式有个坑:它默认只基于屏幕尺寸切换,不会自动生成简化版发射器。所以我们需要手动创建 LOD 变体:
- 右键点击发射器 → `Add LOD Level` → 生成 LOD1、LOD2。
步骤 2:设置距离 Culling(Distance Culling)
在 Niagara 系统属性中,找到 `Visibility` 标签,启用 `Cull by Distance`。设置两个值:
但注意:Cull by Distance 是硬裁剪,会突然消失。更好的做法是配合 `Fade` 模块。在发射器上添加 `Scale Color` 模块,用 `Distance` 驱动透明度,让粒子在 6000 到 8000 之间逐渐淡出。
步骤 3:验证效果
老周按我的方法操作后,`stat particles` 中广告牌的 CPU 更新从 4.2ms 降到了 1.1ms。而且因为 LOD 自动切换,远处广告牌只模拟 200 个粒子,视觉差异几乎看不出来。
关键参数总结:
—
三、实战案例二:GPU 粒子的正确打开方式
老周的“爆炸火花”效果用了 6 万个粒子,CPU 模拟导致每帧更新耗时 8ms。我让他直接切换成 GPU 粒子,但这引发了一个常见问题:GPU 粒子不能使用所有模块,比如 `Collision`(碰撞)和 `Event Handler`(事件处理器)在 GPU 模式下部分失效。
步骤 1:切换 GPU 模拟
在发射器属性中,找到 `Simulation Target`,从 `CPU` 改为 `GPU Compute`。此时 Niagara 会自动禁用不兼容的模块,并在输出日志中给出警告。
步骤 2:用 GPU 友好的模块替代
步骤 3:设置 GPU 粒子专属优化参数
在发射器 `GPU Compute` 设置中,有两个关键参数:
老周把爆炸火花改为 GPU 模拟后,`stat particles` 显示 GPU 更新只有 0.8ms,CPU 时间几乎为 0。而且因为 GPU 粒子能支持数百万级别,他后来把粒子数量加到了 20 万,帧率依然稳定在 60。
步骤 4:混合使用 CPU 和 GPU 粒子
不是所有效果都适合 GPU。比如需要精确控制每个粒子位置的“轨迹拖尾”,CPU 更合适。我的建议是:
—
四、进阶技巧:Culling 的层级组合
除了 Niagara 内部的 LOD 和距离裁剪,��还需要在关卡层面做 Culling。这里推荐三个组合拳:
1. 场景 Culling 体积:在需要特效出现的区域放置 `Culling Volume`,体积外的粒子系统会被自动剔除。适用于“只在特定房间触发的爆炸”。
2. 可见性遮罩(Visibility Mask):在项目设置中启用 `Occlusion Culling`,并确保粒子系统勾选 `Use Occlusion Culling`。这样,被墙壁挡住的粒子不会渲染,但注意:半透明粒子默认不参与遮挡剔除,需要手动勾选。
3. 动态分辨率缩放:如果特效导致 GPU 过载,可以在 `Project Settings → Rendering` 中启用 `Dynamic Resolution`,设置最小屏幕百分比为 50%。当 GPU 负载超标时,UE5 会自动降低分辨率,保证帧率稳定。
—
五、总结与学习建议
优化特效性能,本质上是管理预算——CPU 时间、GPU 时间、内存带宽。我的建议是:
1. 建立性能预算表:在项目初期,确定每个场景的特效预算(比如 PC 端半透明特效总耗时不超过 4ms,粒子数不超过 5 万)。每次添加特效前,先问“这预算够吗?”
2. 工具先行:每完成一个特效,就�� `stat gpu` 和 `stat particles` 检查。不要等整个场景卡成幻灯片再排查。
3. LOD 是底线:任何超过 5000 粒子的系统,必须做 LOD。不要相信“我机器跑得动”,玩家机器不是你的开发机。
4. GPU 粒子是趋势:UE5.3 的 GPU 粒子已经支持大部分常用模块,遇到性能问题时,优先考虑切换到 GPU 模拟。
5. 多看官方示例:下载 UE5 官方的 `Niagara Examples` 项目,重点看 `Advanced` 文件夹下的 GPU 粒子案例,里面的参数设置比任何教程都详细。
如果你想要一份我整理的特效性能检查清单(包含 30 个检查点),可以在评论区留言,我会在后续文章中分享。
—
常见问题 FAQ
Q1:GPU 粒子在移动端(如 iOS/Android)支持吗?
A:支持,但有限制。移动端的 GPU 粒子要求 ES 3.1 及以上,且部分模块(如 Distance Field Collision)在移动端不可用。建议移动端粒子数量控制在 2 万以内,并关闭 `Shared Write`。
Q2:Niagara LOD 的 Auto 模式为什么有时不切换?
A:Auto 模式基于屏幕大小,但如果粒子系统被放置在 `Screen Size` 计算范围之外(比如极远处),可能不会触发。此时手动设置 `Min Screen Size` 和 `Max Screen Size`,强制指定切换范围。
Q3:粒子系统使用 Cull by Distance 后,粒子会突然消失,怎么��决?
A:不要依赖单个 Cull 设置。先用 LOD 降低粒子数量,再用 `Scale Color` 模块按距离淡出,最后才用 Cull by Distance 做最终裁剪。三层组合才能平滑过渡。
Q4:我用了 GPU 粒子后,材质不生效了,为什么?
A:GPU 粒子不支持部分材质节点,比如 `Particle Position` 和 `Particle Velocity` 在某些情况下会失效。检查材质中是否使用了 `Particle` 相关的表达式,如果有,改用 `Dynamic Parameter` 或 `Particle Attribute` 节点。
Q5:优化后粒子数量减少了,但看起来变差了,怎么办?
A:减少数量时,同步增加粒子大小和透明度,用“视觉密度”弥补数量不足。另外,添加 `SubUV` 动画或 `Ribbon` 渲染器,让单个粒子看起来更丰富。记住:优化不是降质,而是用更聪明的渲染方式。


评论(0)