首页/ 第 12 章 · 特效与粒子/ 第 198 课
LESSON 198 · 特效与粒子

特效性能优化

特效优化已掌握。下一课综合练习特效与音频整合。

⏱ 约 14 分钟📊 难度:入门🗂 第 12 章 · 特效与粒子📍 第 198 / 300 课
课程进度
198 / 300

🎯本节学习目标

  • 掌握粒子优化
  • 掌握对象池
  • 掌握纹理与批处理

🚀课程导读

特效越多越华丽,也越吃性能。本课学会“既要特效又不卡”。

粒子优化

控制“量”。

  1. 【Max Particles】Particle System 的 Main 模块有 Max Particles 上限:限制粒子总数,防失控爆表。
  2. 【Rate/Burst 节制】发射率与爆发数按需设置,肉眼分辨不出时尽量小。
  3. 【Lifetime 缩短】粒子寿命短 = 同时存活的少 = 省性能。
  4. 【Renderer 简化】不用贴图/用简单贴图;Render Mode 选最省。
  5. 【关键】大量同材质粒子能合批(GPU 一次画),材质尽量统一。
  6. 【粒子数估算】屏幕上百粒子量级轻松,上千要小心。
  7. 【代码】ps.maxParticles = 500;
  8. 【注意】特效密度与画面复杂度平衡,移动端尤其克制。
  9. 【工具】Profiler 的 Rendering 查看粒子开销(第 268 课)。
💡
粒子优化三板斧:限数量(Max Particles)、缩短寿命、统一材质。

对象池与纹理优化

“反复用的特效”不重建。

  1. 【问题】频繁实例化/销毁特效(爆炸、子弹火花)会造成卡顿(GC 与 Instantiate 开销)。
  2. 【对象池】预创建一批特效,用完“回收”再“复用”:
  3. public class ObjectPool : MonoBehaviour {
  4. public GameObject prefab; public int size = 20;
  5. List<GameObject> pool;
  6. void Start() { pool = new List<GameObject>(); for (int i=0;i<size;i++) { var g = Instantiate(prefab); g.SetActive(false); pool.Add(g);} }
  7. public GameObject Get() {
  8. foreach (var g in pool) if (!g.activeSelf) { g.SetActive(true); return g; }
  9. var n = Instantiate(prefab); pool.Add(n); return n;
  10. }
  11. public void Release(GameObject g) { g.SetActive(false); }
  12. }
  13. 【用法】爆炸时 pool.Get() 取一个 → 用完后协程延时 Release。
  14. 【纹理优化】贴图尺寸 2 的幂、用压缩格式(ASTC/ETC2)、关 Mipmap(UI/特效不需要远景)。
  15. 【批处理】同材质、同 Shader 的特效尽量合并(图集,第 41 课)。
  16. 【LOD】远处特效降低细节(可选)。
  17. 【完成】特效再多也流畅。
  18. 【注意】对象池释放时记得把粒子重置(ps.Clear())。
对象池是“特效工厂”:预生产、循环复用、零垃圾回收。高频特效必备。

常见错误与排查

错误:用对象池后特效变“残影”?
原因:复用前没重置粒子
解决:Get 时调用 ps.Clear() + ps.time=0 重置再 Play。

动手练习

课后小任务(做出来才算真的学会)

  • 设置粒子上限与寿命控制
  • 实现特效对象池
  • 优化纹理导入设置

本节小结

特效优化已掌握。下一课综合练习特效与音频整合。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课综合特效制作:技能特效