特效性能与预算
自动关联目录:特效性能与预算
1. 定位
特效的性能问题几乎总在"峰值"而不是"平均":平时很流畅,一场团战/一次爆炸就掉到个位数帧率。
一句话定位:特效必须有预算制度——单个特效的上限 + 同屏总量的上限,两者都要有。
2. 成本构成
成本 ≈ 粒子数 × 每粒子模拟复杂度
+ 像素填充(overdraw)
+ 生成/销毁开销
+ (若为粒子光源)光照成本| 来源 | 说明 |
|---|---|
| 模拟 | CPU 粒子占 Game 线程;GPU 粒子占 GPU(见 Niagara 模拟与 GPU 粒子) |
| 填充率(overdraw) | 半透明特效的主要成本——大面积烟雾/火焰叠加 |
| 生成/销毁 | 频繁 Spawn 系统的开销(见 特效池化与复用) |
| 粒子光源 | 极贵(见 Niagara 概览) |
| 半透明排序 | 见 半透明与排序 |
最容易被低估的是 overdraw:一个"看起来很小"的烟雾,铺满屏幕时每个像素都被叠了十几层。用 Quad Overdraw 视图检查(见 渲染调试)。
3. 预算制度
| 层级 | 做法 |
|---|---|
| 单个特效 | 限定最大粒子数、最大屏幕占比 |
| 同类特效 | 同时存在的实例上限 |
| 同屏总量 | 全局的特效预算或管理器 |
| 降级 | 按画质档/平台降低粒子数与效果 |
| 距离剔除 | 远处不生成或降低规模 |
推荐做法:做一个特效预算管理器,超预算时按优先级拒绝或降级,而不是靠美术自觉。
4. 优化手段
| 手段 | 说明 |
|---|---|
| 减少 overdraw | 缩小尺寸、减少层数、优化材质 |
| GPU 粒子 | 大规模用(见 GPU 粒子篇) |
| 池化 | 见 特效池化与复用 |
| LOD / 降级 | 远处与低画质档简化 |
| PSO 预缓存 | 特效材质也要预缓存,否则首现卡顿(见 PSO 预缓存) |
| 减少粒子光源 | 严格控制数量 |
| 合并 Emitter | 减少开销 |
特效的 PSO 常常被漏掉:新特效首次出现时编译 PSO → 卡顿。必须纳入预缓存收集。
5. 代价与权衡
| 设计 | 收益 | 代价 | 什么时候不该用 |
|---|---|---|---|
| 严格预算 | 峰值可控 | 极端时特效被砍 | 关键演出特效要设高优先级 |
| 降 overdraw | 收益最大 | 视觉密度下降 | 核心演出可以放宽 |
| 距离剔除 | 省 | 远处特效消失 | 需要远景氛围时保留低配版 |
| GPU 粒子 | 数量上限高 | 见 GPU 粒子篇 | — |
| 粒子光源 | 气氛 | 极贵 | 数量必须个位数 |
6. 踩坑与排查
| 坑 | 现象 | 怎么验证 |
|---|---|---|
| 只测单个特效 | 峰值测不到 | 压测多个特效同时播放 |
| 忽略 overdraw | 烟雾很卡 | Quad Overdraw 视图 |
| 特效 PSO 没预缓存 | 首现卡顿 | 见 PSO 篇 |
| 粒子光源滥用 | 光照成本暴涨 | 统计数量 |
| 频繁生成销毁 | 尖峰 | 池化(见池化篇) |
| 移动端不降级 | 崩 | 按平台分级 |
| 预算只靠约定 | 迟早超 | 做成机制 |
7. 排查顺序
1. 压测:多个特效同时播放,看峰值
2. stat unit / profilegpu → 是 CPU(模拟)还是 GPU(填充)
├─ CPU → 粒子数 + CPU/GPU 粒子选择
└─ GPU → overdraw(Quad Overdraw 视图)
3. 检查粒子光源数量
4. 特效 PSO 是否预缓存
5. 建立预算与降级机制参考
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/4f4f14f6.html
更新于:2026年10月10日