20.帧率问题排查
20.1 题目
假设一个游戏存在帧率不稳定的问题,你如何进行排查和优化?
20.2 深入解析
使用Unity内置性能分析工具定位问题
Unity Profiler 和 Frame Debugger结合使用:
- Profiler:定位CPU和GPU性能瓶颈、内存问题等
- Frame Debugger:逐帧检查渲染问题
帧率不稳定的可能原因(从这些可能原因作为出发点去进行优化):
- CPU负载过高 —— 物理计算过高、逻辑计算过于复杂
- GPU负载过高 —— DC过多、Shader计算量过大、粒子系统特效、屏幕后处理
- GC频繁(内存问题)—— 内存压力过大
- VSync(垂直同步):与显示器刷新对齐,可减轻撕裂;是否开启需结合目标帧率与手感测试,并非卡顿主因的唯一解释,需与 CPU/GPU/GC 数据对照
等
20.3 答题示例
当帧率不稳定时,我首先会打开 Unity Profiler 结合 Frame Debugger 定位瓶颈:
- CPU:检查脚本执行时间、GC 分配、Physics、AI 逻辑等。
- GPU:查看 Draw Call、SetPass Calls、Shader 时间、粒子与后处理开销。
- 内存/GC:观察每帧的分配量,是否频繁触发垃圾回收。
- VSync:确认垂直同步设置是否导致帧率锁定或抖动。
定位后分别采取优化措施:
- 脚本逻辑:将重计算分帧、缓存重复结果,减少 Update 函数数量。
- 渲染:合并材质、开启静态/动态批处理、使用 LOD、剔除不可见对象。
- GC 优化:对象池重用、减少临时分配、使用 struct 或 ArrayPool。
- VSync:根据项目需求开启或关闭,避免帧率被硬锁。
最后再回到 Profiler 验证帧率是否稳定、各项指标是否达标。
20.4 关键词联想
- Unity Profiler
- Frame Debugger
- CPU vs GPU 瓶颈
- Draw Call/Batches
- SetPass Calls
- GC 分配 & 垃圾回收
- 对象池 (Object Pool)
- LOD / Occlusion Culling
- VSync 设置
- Update/FixedUpdate 调度
- 后处理和粒子优化
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com