4. 帧率优化入门
帧率优化不是简单地把画质调低,而是先判断“谁在拖后腿”,再选择匹配的手段。一个游戏画面从逻辑更新到最终显示,要经过 CPU 逻辑、渲染提交、GPU 绘制、显示扫描多个阶段。任何一段超时,都会让帧率下降或产生卡顿。本节围绕四个基础工具展开:帧率瓶颈分析、垂直同步、动态分辨率与帧生成。
一、帧率瓶颈分析:先定位,再优化
帧率瓶颈分析的目标是回答三个问题:当前帧时间是多少、哪一阶段占用最多、优化后是否真的变快。常用指标包括平均帧率(FPS)、帧时间(Frame Time,毫秒)、1% Low 与 0.1% Low。平均帧率好看但 1% Low 很低,说明存在周期性卡顿,例如资源加载、GC 或着色器编译。
分析时建议按“粗到细”推进:先用性能面板看 CPU/GPU 占用与帧时间曲线,再用 GPU 计时器拆分渲染阶段,最后用 CPU Profiler 定位逻辑热点。下面是一段典型的帧时间日志,可用于判断瓶颈归属:
Frame 1024 | CPU 14.2ms | GPU 6.8ms | FPS 70 | 1%Low 48
Frame 1025 | CPU 15.1ms | GPU 6.5ms | FPS 66 | 1%Low 45
Frame 1026 | CPU 13.8ms | GPU 6.9ms | FPS 72 | 1%Low 50
# CPU 时间明显高于 GPU,瓶颈在 CPU 侧
若日志反过来,GPU 时间远高于 CPU,则应优先检查分辨率、阴影、后处理、透明与粒子。若两者接近且都接近 16.6ms,说明处于临界状态,任何波动都会掉帧,此时应留出 20% 余量。
二、垂直同步:消除撕裂,但引入延迟
垂直同步(VSync)让 GPU 在显示器垂直消隐期交换缓冲区,从而避免画面撕裂。代价是引入输入延迟,并且在帧率低于刷新率时可能从 60 掉到 30,产生明显顿挫。常见策略有三种:
- 关闭 VSync:延迟最低,但可能出现撕裂,适合竞技类。
- 开启 VSync:画面完整,但延迟增加,适合单机与观影。
- 自适应/快速 VSync:帧率高于刷新率时同步,低于时允许撕裂,兼顾延迟与完整度。
更现代的做法是配合可变刷新率(VRR/G-Sync/FreeSync),让显示器刷新率跟随帧率变化,既减少撕裂又降低延迟。此时应限制帧率略低于刷新率上限,例如 144Hz 显示器锁 141 FPS,避免超出 VRR 窗口。
三、动态分辨率:用清晰度换稳定帧率
动态分辨率(Dynamic Resolution)根据 GPU 帧时间实时调整渲染分辨率,再放大到目标分辨率输出。它的价值在于把“偶尔掉帧”转化为“轻微模糊但稳定”。实现上通常设定目标帧率与分辨率上下限,例如 50%~100%,并配合时间抗锯齿(TAA)或超分算法减少缩放带来的闪烁。
调参时要注意:分辨率下限过低会导致文字与细线模糊;缩放步进过快会产生“呼吸感”。建议步进控制在 5%~10%,并加入滞回区间,避免在阈值附近反复抖动。
四、帧生成基础:插帧不是免费午餐
帧生成(Frame Generation)在两张真实帧之间插入一张生成帧,从而提高显示帧率。它依赖运动矢量、深度与光流信息,因此需要游戏与驱动配合。关键限制是:生成帧不响应输入,基础帧率过低时延迟反而更明显。通常建议基础帧率不低于 40~50 FPS,并配合 Reflex 等低延迟技术使用。
| 手段 | 主要收益 | 代价/风险 | 适用场景 |
|---|---|---|---|
| 瓶颈分析 | 定位 CPU/GPU 热点 | 需要工具与时间 | 所有优化第一步 |
| 垂直同步 | 消除撕裂 | 增加延迟,可能掉档 | 单机、观影 |
| 动态分辨率 | 稳定帧率 | 画面变软、闪烁 | GPU 受限且波动大 |
| 帧生成 | 提升显示帧率 | 延迟、伪影、需基础帧率 | 基础帧率较高时 |
五、案例与复盘:一次“越优化越卡”的排查
某项目在 1080p 下平均 58 FPS,但 1% Low 只有 32。团队先开启动态分辨率,平均帧率升到 62,但 1% Low 仍为 33,说明瓶颈不在 GPU。进一步用 CPU Profiler 发现每帧有 3 次同步资源加载,导致主线程等待。改为异步预加载并加入对象池后,1% Low 提升到 52,此时再开启动态分辨率,平均帧率稳定在 70 以上。
总结来看,帧率优化的顺序应是:先测量、再定位、后调参。垂直同步解决撕裂但增加延迟,动态分辨率稳定帧率但牺牲清晰度,帧生成提升显示帧率但依赖基础帧率与低延迟配合。把四者放在同一条决策链上,才能既快又稳。