从今天开始,我们会开启“⼩教程”的兄弟栏⽬——⼩科普,给⼤家介绍在配电脑或玩游戏过程中经常会遇到的专业名词。
第⼀期“⼩科普”我们来讲讲游戏中经常会遇到的⼀个画⾯选项——垂直同步
我们曾在⼀期语⾳⾥和⼤家讲探讨过垂直同步的功⽤,可惜语⾳有 60 秒的长度限制,并不能和⼤家解释清楚,那么今天就来详细分析⼀下“垂直同步”:
•
它到底是⼲嘛⽤的?
•
它有什么缺点吗?
•
和它搭档的“三重缓冲”⼜是个啥?
以及最重要的⼀点:我在游戏中到底该不该开启它?
(本⽂中的部分内容参考⾃外媒 Anandtech 的技术⽂章,我们将在⽂末提供其链接)
另外,本⽂阅读起来有难度,如果你是抱着太长不看的⼼态阅读,建议直接看最后的结论。
▌垂直同步是⼲嘛的?
要想解答这个问题,⾸先得来说说“垂直同步”所解决的问题——画⾯撕裂。当我们在玩游戏的时候,有没有遇到下图这种情况呢:
⼀帧画⾯被分割开了,这种情况便是“画⾯撕裂”。
不过你可能会说,我⽤的可是⾼端显卡呀,为什么还会出现这种问题呢?
你还别说,越是⾼端的显卡,跑到的帧数越⾼,还就越容易出现这种问题。
这⾥就要说说说画⾯撕裂产⽣的原因了。为了⽅便各位理解,我们先来简单说说显卡与显⽰器之间是如何⼯作的:
可以看到,显存中的“帧缓冲区”(Framebuffer)是图像传输的⼀个关键区域,显卡所⽣成的⼀帧画⾯
会先被写⼊帧缓冲区。⽽⼀台 60Hz 的显⽰器每秒能够显⽰ 60 幅画⾯,也就是说每 1/60 秒(当显⽰器刷新完⼀幅画⾯时)会给显卡发送⼀次“垂直同步信号“,向帧缓冲区索取⼀次画⾯数据,然后显⽰出来。
不过光有⼀个帧缓冲区会产⽣⼀个问题,这⼀个缓冲区会不断地写⼊新的画⾯并发送给显⽰器,这样⼀来“写⼊的全过程”就会被展现在屏幕上了,这就会导致画⾯闪烁等问题。因此,现代的图形⼯作流程中使⽤的多是双重缓冲:
双重缓冲有⼀前⼀后两个缓冲区,显卡只会将绘制完的图像写⼊后缓冲区,与此同时只有前缓冲区中的图像会被发送给显⽰器。
当后缓冲区中的“新鲜”图像写⼊完成后,注意啦,程序不会将后缓冲区的画⾯传输到前缓冲区,⽽是会进⾏缓冲区的交换(Swap)——将前缓冲区和后缓冲区的名字对调,即前缓冲区成了后缓冲区,后缓冲区成了前缓冲区。这样以后,
换(Swap)——将前缓冲区和后缓冲区的名字对调,即前缓冲区成了后缓冲区,后缓冲区成了前缓冲区。这样以后,刚刚绘制在后缓冲区的图像就能顺利地传给显⽰器了。经过这么⼀折腾,程序就可以在往后缓冲区写⼊图像的同时,不影响显卡将前缓冲区中的画⾯传给显⽰器,然后进⾏下⼀次“缓冲区交换”。
但是双重缓冲有个问题,两个缓冲区随时都可能发⽣交换,所以就会出现这种情况:前缓冲区中的画⾯才刚传输了⼀半给显⽰器,两个缓冲区就发⽣交换了,后⾯传输的都是原来后缓冲区中的画⾯(即下⼀帧画⾯)。于是,显⽰器上的⼀幅画⾯成了前后两帧的结合,这就是画⾯撕裂。这种问题在⾼帧率情况下尤为显著,因为帧率越⾼,前后缓冲区的交换就越为频繁,发⽣这种事件(画⾯没输出完就交换了)的概率⾃然也就更⾼。
-哇,原来画⾯撕裂是这么来的啊!那有没有什么办法能解决它呢?
-当然有了,那就是“垂直同步”选项。
(PS:“垂直同步”是⼀种简写,完整的称呼应是“等待垂直同步信号”)
开启垂直同步,就相当于在帧缓冲区⾥架设了红绿灯。当显⽰器尚未完成⼀帧画⾯的刷新时,红灯亮起,两个缓冲区不允许交换;当显⽰器刷新完⼀帧画⾯时,绿灯亮起,此时缓冲区可以进⾏交换了。这样以后就杜绝了“在进⾏数据传输的过程中交换缓冲区“的可能,⾃然也就解决了画⾯撕裂的问题。
不过为啥这个功能要叫“垂直同步”呢?这是因为在 CRT ⼤屁股显⽰器的年代,显⽰器的刷新是逐⾏或隔⾏刷新的,电⼦⼀⾏⼀⾏地打下去,打完每⼀⾏就称这⼀⾏完成了“⽔平同步”,打到最后⼀⾏的最后⼀个像素点就完成了⼀帧画⾯的显⽰,然后显⽰器会给显卡发送“垂直同步信号”,表明垂直向的像素点也完成了同步,即这⼀帧刷新完成了。
- 哇,垂直同步这么好,那我现在就去游戏⾥打开它,如何?
- 别急,“垂直同步”虽然能彻底杜绝画⾯撕裂,但是它的副作⽤同样很明显——操作延迟。
在帧率⽐显⽰器刷新率⾼很多的情况下,为了将显⽰器的刷新时间和显卡向缓冲区写⼊画⾯的时间保持同步,必然就需要⼈为地增加延迟,来延后“过快⽣成的画⾯“向显⽰器的输出。因此在竞技游戏中,开启垂直同步后的⼿感会⼤打折扣。
这⾥⽤⼀个实例来作说明:
这是未开启垂直同步时,传统双重缓冲下的图像,由于 300fps 的⾼帧率,每两个“垂直同步信号“之间会⽣成⾼达 5 幅画⾯,这就导致了严重的画⾯撕裂。
这是开启了垂直同步后的图像,可以看得出画⾯撕裂的问题确实得到了解决,但为了将帧缓存交换的时间和显⽰器刷新时间保持同步,帧缓存中的画⾯将会延后⼀个刷新周期被显⽰出来。在使⽤ 60Hz 显⽰器时,⼀个刷新周期的时间⾼达16.67ms,也就是说本来⼀秒五帧的图像延迟只有 3.3ms,现在因为要⼲等⼀个刷新周期,延迟⼀下⼦就增加到了13.3ms,对于连 5ms 和 1ms 显⽰器都能分清的电竞选⼿⽽⾔,这多出来的10毫秒延迟是⾮常要命的。
- 哎呀,不开垂直同步会画⾯撕裂,开了⼜会有延迟,那画质和性能就不能兼得吗?
- 能啊,要想画质与操作兼得,有两个办法
一台电脑两个显示器第⼀个办法,买个 G-SYNC 或 FreeSync 的电竞显⽰器
这些显⽰器可以动态调整⾃⼰的刷新率,使其和显卡输出画⾯的帧率完全同步,这样不仅可以在解决画⾯撕裂的同时不出现操作延迟,还可以在帧率低于 60fps 的情况下同样提供垂直同步的效果,消除画⾯撕裂。不过,这毕竟是个要花⼤钱的办法,⽽且据我所知,⼏乎没有哪个电竞屏的屏幕素质是很优秀的,为了达到低延迟,许多电竞屏都采⽤了 TN ⾯板,对于电竞选⼿⽽⾔当然⽆可厚⾮,但对我这样的画⾯党来说,这样的屏幕看起来就有点难以接受了。
板,对于电竞选⼿⽽⾔当然⽆可厚⾮,但对我这样的画⾯党来说,这样的屏幕看起来就有点难以接受了。
第⼆个办法,相信⼤家已经猜到了:三重缓冲!
既然垂直同步的延迟是因为显卡输出完⼀幅图像就歇着等待红绿灯了,⽆法响应⿏标键盘最新的操作,那么我们为啥不让显卡⼀直⼯作呢?这样不就能⼀直响应最新的输⼊操作了吗?三重缓冲就是基于这种思路设计的,它在双重缓冲的基础上再加⼊了⼀个帧缓冲区,组成了⼀个前缓冲区,两个后缓冲区的规格。程序来回向两个后缓冲区写⼊图像,每次显⽰器刷新时,前缓冲区就和最近完成写⼊的
那个后缓冲区交换。可以看到,即便有⼀个缓冲区要受到红绿灯的管控,另外两个缓冲区还是可以来回写⼊图像,于是就不需要⼈为增加画⾯延迟了。
这张图便说明了三重缓冲的原理,这种⽅法结合了前两种的优点。
不过三重缓冲也并⾮完美⽆瑕。⾸先由于需要⼀个额外的帧缓冲区,因此它会占⽤更多的显存空间。⽐如我们在 4K 分辨率下运⾏《质量效应:仙⼥座》,三重缓冲额外占⽤了约 200MB 的显存,对我们⽽⾔尚可接受。其次,它的延迟虽然远远低于双重缓冲下的垂直同步,但相⽐不开垂直同步还是可能略微⾼⼀点,因为⽆垂直同步的画⾯在给你带来撕裂的同时,也会包含最新帧的图像,如果开启了三重缓冲,那么画⾯中这“后⾯⼀帧“的多余元素就会被剔除,延迟⾃然会略微⾼于前者⼀点点。不过和满屏的画⾯撕裂相⽐,我显然还是会选择三重缓冲的……
看到这⾥,你肯定迫不及待地想要开启三重缓冲了吧,的确,垂直同步+三重缓冲是种⾮常棒的技术,可以有效地改善画⾯撕裂,同时不造成画⾯延迟。但是问题来了,DirectX 并不原⽣⽀持三重缓冲!⽽是使⽤了⼀种叫“预渲染队列“的⽅式。这种⽅式与三重缓冲不同的地⽅在于,它不会丢弃显卡渲染完却未被使⽤的帧(即过时的帧),⽽会强制将这些旧帧显⽰出来,因此会造成更⼤的操作延迟,甚⾄⽐光开垂直同步的延迟还要⼤。DirectX 的游戏若想使⽤三重缓冲,需要游戏⼚商提供相应的⽀持。
很可惜的是,不少采⽤ DX API 游戏虽然在画⾯选项⾥提供了”三重缓冲“选项,实际上却是使⽤了“包
含 3 个缓存空间的预渲染队列”,这些游戏使⽤的到底是不是真正的三重缓冲,只有你亲⾝体验后才能弄明⽩。所以,能不能开启三重缓冲,还要看游戏⼚商的⼼情啊!
▌总结:
垂直同步和三重缓冲到底该不该开呢?如果游戏⽀持,条件允许的话(对于 60Hz 显⽰器的⽤户,显卡能跑到 60 帧以上),还是尽量开起来试试。但如果你的显卡达不到这么⾼的速度,或者你经过试验发现某⼀款游戏在三重缓冲下的操作延迟依然很⾼,那还是把它关了吧。
本⽂的阅读难度不低
如果⼤家有任何疑惑
都可以给我们留⾔
我们在之后会考虑
将本⽂做成视频的形式
以便更形象地向⼤家说明
“垂直同步”和“三重缓冲”的⼯作原理
如果各位有任何其他的名词希望我们解释
也可以告诉我们哦!
最后附上参考资料,欢迎⼤家参阅
原⽂来⾃外媒Anandtech:Triple Buffering: Why We Love It 国内超能⽹的译⽂:
喜欢我们的推送别忘了点⼀个顶,向亲朋好友推荐⼀下我们的⽂章,或者赞赏⼀下,
我们下期再见啦!
发布评论