首页/ 第 15 章 · 寻路与导航/ 第 265 课
LESSON 265 · 寻路与导航

脚本与 GC 优化

脚本与 GC 优化完成。下一课学资源与加载优化。

⏱ 约 15 分钟📊 难度:入门🗂 第 15 章 · 寻路与导航📍 第 265 / 300 课
课程进度
265 / 300

🎯本节学习目标

  • 掌握缓存技巧
  • 避免每帧分配
  • 优化字符串

🚀课程导读

“GC 卡顿”是脚本元凶。本课学会写出“不产生垃圾”的代码。

缓存与查找优化

别每帧“找”。

  1. 【问题】GetComponent/Find/FindObjectOfType 每帧调用很慢。
  2. 【缓存】在 Awake/Start 缓存引用:
  3. private Rigidbody rb;
  4. void Awake() { rb = GetComponent<Rigidbody>(); }
  5. 【之后】直接用 rb,不再 GetComponent。
  6. 【Find 禁用】避免 FindGameObjectWithTag/Find(用引用/单例/序列化)。
  7. 【transform 缓存】transform 属性访问有开销,缓存:
  8. Transform t; void Awake() { t = transform; }
  9. 【循环】for 比 foreach 快(foreach 有枚举器分配)。
  10. 【每帧循环】Update 里别放重复查找。
  11. 【注意】改对象结构后缓存会失效(重新获取)。
  12. 【测试】Profiler 对比缓存前后。
  13. 【完成】脚本“轻”了!
💡
缓存黄金律:Awake 拿一次引用,Update 直接复用。GetComponent 进 Start 不进 Update。

GC 优化与字符串

消灭垃圾。

  1. 【GC 原理】每帧分配(new)的对象最终要回收(GC),回收时卡顿。
  2. 【避免每帧分配】
  3. 每帧 new 数组/List/string = 垃圾。
  4. 复用:预分配 List/数组,Clear 后重用。
  5. 【字符串拼接】每帧 “分数:” + score 会产生新字符串:
  6. 用 StringBuilder(System.Text):
  7. StringBuilder sb = new StringBuilder(16);
  8. sb.Clear(); sb.Append("分数:").Append(score); text.text = sb.ToString();
  9. 或缓存:“只在分数变化时更新文字”。
  10. 【闭包/委托】每帧 new 委托也是垃圾:缓存委托。
  11. 【协程】每帧启动协程有开销:常驻协程用 while(true) + yield。
  12. 【对象池】高频物对象池(第 198 课)。
  13. 【Profiler】Memory 模块看 GC Alloc 每帧分配量。
  14. 【目标】移动端每帧 GC Alloc < 1KB 理想。
  15. 【注意】装箱(int 转 object)也分配:避免隐式装箱。
  16. 【完成】“零垃圾”代码!
  17. 【测试】Profiler 看 GC Alloc 下降。
  18. 【说明】减少分配 = 减少 GC 卡顿,这是脚本优化核心。
GC 三不:不每帧 new、不每帧拼字符串、不每帧 GetComponent。做到就流畅。

常见错误与排查

错误:还是卡?
原因:GC Alloc 仍高
解决:用 Profiler Memory 定位分配源;重点查每帧 new/字符串/委托。

动手练习

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

  • 缓存组件引用
  • 用 StringBuilder 优化拼接
  • 用 Profiler 验证 GC 下降

本节小结

脚本与 GC 优化完成。下一课学资源与加载优化。

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

← 上一课物理优化