特效池化与复用
自动关联目录:特效池化与复用
1. 定位
频繁生成和销毁 Niagara 组件是有成本的:组件创建、参数初始化、首次模拟、PSO 编译——这些叠加起来就是"连续触发特效时的尖峰"。
一句话定位:高频特效必须池化——复用组件而不是反复创建。
2. 池化的做法
初始化:预创建 N 个 NiagaraComponent(或对象池)
使用时:取一个 → 设置参数 → 激活
结束时:停用并归还,而不是销毁| 要点 | 说明 |
|---|---|
| 预创建 | 在加载阶段创建好,避免运行时尖峰 |
| 复用 | 用 Activate / Deactivate 而非 Create/Destroy |
| 参数重置 | 复用时必须重置所有参数,否则残留 |
| 上限 | 池的大小也要有限制,防内存膨胀 |
复用时忘记重置参数是池化最常见的 bug——表现为"特效偶尔带着上一次的颜色/位置"。
3. 复用的其它层次
| 层次 | 做法 |
|---|---|
| 组件池 | 复用 NiagaraComponent |
| System 资产复用 | 一个 System 用参数适配多种情况,而不是做十个资产 |
| Module 复用 | Niagara 的模块本身就是可复用单元 |
| 材质复用 | 特效材质共用,利于合批与 PSO 收敛 |
| 图集 | 粒子贴图打成图集,利于合批 |
"一个 System + 参数" 比 "十个 System" 好:资产变体越多,PSO 与内存成本越高。
4. LOD 与降级
| 手段 | 说明 |
|---|---|
| 距离 LOD | 远处减少粒子数、关闭次要 Emitter |
| 画质档 | 低档降低粒子数与效果 |
| 平台差异 | 移动端单独配置 |
| 重要性分级 | 关键特效保留,次要的先被砍 |
5. 代价与权衡
| 设计 | 收益 | 代价 | 什么时候不该用 |
|---|---|---|---|
| 池化 | 消除生成/销毁尖峰 | 内存常驻、要管理重置 | 低频特效不必 |
| System 参数化 | 资产少、PSO 少 | 单个 System 变复杂 | 差异极大的特效应分开 |
| 距离 LOD | 远处省 | 要配多套 | 小场景不必 |
| 图集 | 合批 | 资产管理 | 少量特效不必 |
| 池太大 | 不复用不足 | 内存浪费 | 按峰值设定上限 |
6. 踩坑与排查
| 坑 | 现象 | 怎么验证 |
|---|---|---|
| 复用忘了重置参数 | 特效带上次的状态 | 归还时统一重置 |
| 池太小 | 仍然创建新的 | 统计池命中率 |
| 池太大 | 内存浪费 | 按峰值设定 |
| 资产变体太多 | PSO 与内存涨 | 参数化收敛 |
| 材质不共用 | 合批差、PSO 多 | 复用材质与图集 |
| 移动端不降级 | 崩 | 平台分级 |
7. 排查顺序
1. 有尖峰?→ 是否频繁创建销毁 → 池化
2. 池化后异常?→ 参数重置
3. 内存大?→ 池上限
4. PSO 多?→ 收敛 System 与材质变体
5. 远处/低端?→ LOD 与降级参考
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/e6567e4a.html
更新于:2026年10月10日