U
Unity
星辰学院
首页
课程表
章节导览
第 1 课
返回主站
首页
/
第 15 章 · 寻路与导航
/
第 265 课
LESSON 265 · 寻路与导航
脚本与 GC 优化
脚本与 GC 优化完成。下一课学资源与加载优化。
⏱ 约 15 分钟
📊 难度:
入门
🗂 第 15 章 · 寻路与导航
📍 第 265 / 300 课
课程进度
265 / 300
🎯
本节学习目标
掌握缓存技巧
避免每帧分配
优化字符串
🚀
课程导读
“GC 卡顿”是脚本元凶。本课学会写出“不产生垃圾”的代码。
◆
缓存与查找优化
别每帧“找”。
【问题】GetComponent/Find/FindObjectOfType 每帧调用很慢。
【缓存】在 Awake/Start 缓存引用:
private Rigidbody rb;
void Awake() { rb = GetComponent<Rigidbody>(); }
【之后】直接用 rb,不再 GetComponent。
【Find 禁用】避免 FindGameObjectWithTag/Find(用引用/单例/序列化)。
【transform 缓存】transform 属性访问有开销,缓存:
Transform t; void Awake() { t = transform; }
【循环】for 比 foreach 快(foreach 有枚举器分配)。
【每帧循环】Update 里别放重复查找。
【注意】改对象结构后缓存会失效(重新获取)。
【测试】Profiler 对比缓存前后。
【完成】脚本“轻”了!
💡
缓存黄金律:Awake 拿一次引用,Update 直接复用。GetComponent 进 Start 不进 Update。
◆
GC 优化与字符串
消灭垃圾。
【GC 原理】每帧分配(new)的对象最终要回收(GC),回收时卡顿。
【避免每帧分配】
每帧 new 数组/List/string = 垃圾。
复用:预分配 List/数组,Clear 后重用。
【字符串拼接】每帧 “分数:” + score 会产生新字符串:
用 StringBuilder(System.Text):
StringBuilder sb = new StringBuilder(16);
sb.Clear(); sb.Append("分数:").Append(score); text.text = sb.ToString();
或缓存:“只在分数变化时更新文字”。
【闭包/委托】每帧 new 委托也是垃圾:缓存委托。
【协程】每帧启动协程有开销:常驻协程用 while(true) + yield。
【对象池】高频物对象池(第 198 课)。
【Profiler】Memory 模块看 GC Alloc 每帧分配量。
【目标】移动端每帧 GC Alloc < 1KB 理想。
【注意】装箱(int 转 object)也分配:避免隐式装箱。
【完成】“零垃圾”代码!
【测试】Profiler 看 GC Alloc 下降。
【说明】减少分配 = 减少 GC 卡顿,这是脚本优化核心。
✅
GC 三不:不每帧 new、不每帧拼字符串、不每帧 GetComponent。做到就流畅。
⚠
常见错误与排查
⛔
错误:
还是卡?
原因:
GC Alloc 仍高
解决:
用 Profiler Memory 定位分配源;重点查每帧 new/字符串/委托。
★
动手练习
课后小任务(做出来才算真的学会)
缓存组件引用
用 StringBuilder 优化拼接
用 Profiler 验证 GC 下降
✓
本节小结
脚本与 GC 优化完成。下一课学资源与加载优化。
标记为已完成
完成打卡后,主站会实时更新你的学习进度 🎯
← 上一课
物理优化
下一课 →
资源与加载优化
↑