4、垂直同步(VSync):垂直同步的作用、开启与关闭的影响、撕裂与卡顿的权衡
垂直同步,英文叫 V-Sync,全称 Vertical Synchronization。这玩意儿在游戏和图形应用里几乎随处可见,但很多人对它又爱又恨。
我刚开始做图形开发那会儿,也搞不懂为什么开了垂直同步帧率就锁死,关了又画面撕裂。后来在项目里被这个问题折磨过几次,才算真正摸透了它的脾气。
说白了,垂直同步就是让 GPU 的渲染节奏和显示器的刷新节奏保持一致。你显示器一秒刷新 60 次,那 GPU 也一秒最多输出 60 帧。多出来的帧?不好意思,等下一轮。
4.1 垂直同步到底在同步什么?
要理解垂直同步,得先知道显示器是怎么工作的。现在的 LCD 显示器,虽然不像老式 CRT 那样逐行扫描,但内部依然有一个固定的刷新周期。
显示器从左上角开始,一行一行往下画,画到右下角算一帧。这个过程中,从最后一行的末尾回到第一行开头的那段空白时间,就叫「垂直消隐期」(Vertical Blanking Interval,VBI)。
垂直同步干的事很简单:让 GPU 只在垂直消隐期切换帧缓冲区。
核心逻辑: 如果 GPU 在显示器正在绘制中间帧的时候切换缓冲区,显示器就会同时看到新旧两帧的内容——这就是撕裂。
我习惯把显示器刷新比作翻书。你正看到第 10 页的一半,突然有人把第 11 页塞进来,那画面就上下错位了。垂直同步就是等你看完第 10 页、翻页的那一瞬间,才把第 11 页放上去。
4.2 开启 VSync 的影响
开启垂直同步,最直观的感受就是画面变「干净」了。没有撕裂,没有错位,整个画面从上到下整整齐齐。
但代价也很明显:
- 帧率被锁死: 60Hz 显示器最高 60fps,144Hz 最高 144fps。GPU 再强也没用,多出来的性能全浪费了。
- 输入延迟增加: 你按一下鼠标,要等显示器完成当前帧、进入消隐期、GPU 才能提交新帧。这个延迟通常在 1-2 帧左右,对 FPS 游戏影响很大。
- 帧率波动更明显: 如果 GPU 渲染一帧的时间刚好超过 16.7ms(60Hz),那它就得等两个消隐期。帧率直接从 60 掉到 30,你会感觉明显的卡顿。
我曾经踩过的坑: 有个项目做实时渲染展示,开了 VSync 后帧率稳定 60,但偶尔掉到 30。排查了半天,发现是某个后处理特效耗时刚好在 17ms 左右。关了 VSync 反而流畅了,虽然有点撕裂,但至少不会突然卡一下。
4.3 关闭 VSync 的影响
关闭垂直同步,GPU 不再等显示器。渲染完一帧就直接往缓冲区写,显示器读到哪算哪。
好处很明显:
- 帧率不受限: GPU 能跑多快跑多快,200fps、300fps 都行。
- 输入延迟最低: 操作立刻反映到画面上,竞技游戏玩家最爱。
坏处也很直接:
- 画面撕裂: 这是最烦人的。屏幕中间一条横线,上下画面错位。快速转动视角时尤其明显。
- 功耗和发热增加: GPU 满负荷跑,风扇呼呼转,电费也涨得快。
你想想看,撕裂到底有多严重?其实跟帧率有关。帧率越高,撕裂的「条带」越窄,越不明显。200fps 下的撕裂比 60fps 下要轻微得多。这也是为什么很多电竞选手宁愿关 VSync 跑高帧率,也不愿意开 VSync 忍受输入延迟。
4.4 撕裂与卡顿的权衡
这里有个经典的权衡问题:你要撕裂,还是要卡顿?
我个人的经验是,分场景处理:
| 场景 | 推荐设置 | 原因 |
|---|---|---|
| 竞技 FPS(CS、Valorant) | 关闭 VSync | 输入延迟最重要,撕裂可以接受 |
| 3A 大作单机剧情 | 开启 VSync | 画面完整性优先,卡顿可接受 |
| 桌面办公/视频 | 开启 VSync | 不需要高帧率,画面稳定就好 |
| 帧率远高于刷新率 | 关闭 VSync | 高帧率下撕裂不明显,延迟更低 |
| 帧率接近刷新率 | 开启 VSync 或 G-Sync | 避免帧率波动导致的卡顿 |
一个小技巧: 如果你的显示器支持 G-Sync 或 FreeSync,那是最好的方案。它能动态调整刷新率匹配 GPU 输出,既没撕裂也没卡顿。我现在的开发机就配了 G-Sync 显示器,写代码和打游戏都舒服多了。
4.5 垂直同步的核心流程
下面这张图,把垂直同步的整个决策过程画清楚了。你可以看到,从 GPU 渲染完成到最终显示,中间经历了什么。
4.6 实际项目中的选择建议
嗯,这里我要说点实在的。你在做自己的项目时,到底该怎么选?
我一般遵循这几个原则:
- 先判断帧率稳定性: 如果你的应用帧率能稳定在显示器刷新率以上,开 VSync 没问题。如果帧率经常波动,建议关掉或者用自适应同步技术。
- 考虑交互类型: 鼠标点击、键盘操作多的应用,输入延迟敏感,关 VSync。视频播放、幻灯片展示,开 VSync。
- 给用户选择权: 我做的每个图形应用,都会在设置里提供「垂直同步」开关。用户自己决定要撕裂还是要卡顿,比开发者替他们选要好。
一句话总结: 垂直同步不是银弹。它解决了撕裂问题,但带来了卡顿和延迟。理解它的工作原理,你才能在项目中做出正确的取舍。