首页/ 第 13 章 · 2D 游戏开发/ 第 224 课
LESSON 224 · 2D 游戏开发

2D 游戏优化

2D 优化已掌握。下一课 2D 章综合练习:发布与收尾。

⏱ 约 14 分钟📊 难度:入门🗂 第 13 章 · 2D 游戏开发📍 第 224 / 300 课
课程进度
224 / 300

🎯本节学习目标

  • 掌握合批优化
  • 掌握对象池
  • 掌握帧率控制

🚀课程导读

2D 游戏卡顿多因 Draw Call 与垃圾回收。本课掌握 2D 优化三板斧。

合批与图集

让 GPU 少跑。

  1. 【Draw Call】每次渲染切换材质 = 一次调用,调多了卡。
  2. 【图集】同一图集的精灵共享材质 → 合批(第 203 课)。
  3. 【规则】同图集 + 同 Shader + 相邻 Sorting 才能合批。
  4. 【避免】避免材质频繁切换(不同图集的物体插花会打断合批)。
  5. 【静态批处理】场景静态物体勾 Static 自动合批(2D 有限)。
  6. 【检查】Profiler/Frame Debugger 查看 Draw Call 数(第 268 课)。
  7. 【目标】手游 2D Draw Call < 100 流畅。
  8. 【注意】每张独立精灵图 = 一个 Draw Call,图集是王道。
  9. 【完成】合批让 2D 性能翻倍。
  10. 【推荐】2D 项目“开局就图集”。
💡
2D 性能第一课:所有精灵进图集,Draw Call 瞬间下降。

对象池与垃圾回收

消灭“卡顿元凶”。

  1. 【问题】频繁 Instantiate/Destroy 触发垃圾回收(GC),突然卡顿。
  2. 【对象池】子弹、敌人、金币、粒子全走对象池(第 198/215 课)。
  3. 【池化】预创建、复用、隐藏式回收。
  4. 【避免每帧分配】每帧 new/string 拼接是 GC 元凶:
  5. 用 StringBuilder 或 string 缓存:
  6. scoreText.text = "分数:" + score; // 每帧拼接会分配
  7. 缓存:string cachedScoreText; 分数变化才更新。
  8. 【避免】Find/GetComponent 每帧调用(缓存引用,第 74 课)。
  9. 【物理】少用射线/少用触发器同时活跃(必要时物理材质合并)。
  10. 【Profile】用 Profiler 查看 GC 分配(第 268 课)。
  11. 【注意】Debug.Log 大量输出也耗性能,发布前清理。
  12. 【完成】2D 游戏“丝滑”。
  13. 【推荐】高频对象(子弹/敌人/粒子)全部对象池化。
2D 流畅秘诀:对象池(消灭 GC)+ 图集(减 Draw Call)+ 缓存(防每帧分配)。

帧率控制

限制与垂直同步。

  1. 【垂直同步】Application.targetFrameRate:
  2. void Awake() { Application.targetFrameRate = 60; QualitySettings.vSyncCount = 0; }
  3. 【说明】targetFrameRate=60 锁 60 帧;=30 锁 30(省电/性能)。
  4. 【手机】vSyncCount=0 让 targetFrameRate 生效(否则被垂直同步覆盖)。
  5. 【场景】高配用 60、低配可降 30。
  6. 【按设备】动态检测帧率自动降(进阶)。
  7. 【注意】targetFrameRate 需在游戏开始设置。
  8. 【完成】帧率可控。
  9. 【测试】Profiler 看实际帧率与耗时。
  10. 【推荐】移动端 60 或 30 明确设置,别放任。
帧率 = targetFrameRate 锁定 + vSyncCount 配合。稳定帧率体验最佳。

常见错误与排查

错误:设置 targetFrameRate 无效?
原因:vSyncCount 没关
解决:QualitySettings.vSyncCount = 0 后再设 targetFrameRate。

动手练习

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

  • 检查 Draw Call 并优化图集
  • 高频对象对象池化
  • 设置目标帧率

本节小结

2D 优化已掌握。下一课 2D 章综合练习:发布与收尾。

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

← 上一课2D 完整小游戏制作(跑酷)