我们往往不愿过多讨论 哪些选项在游戏中应该 开启。相反,我们往往 把重点放在我们的评测 内容上。老实说,我们 对玩游戏的建议设置与 我们的评测设置非常相 似,除了一个非常重要 的选项:三重缓冲(这 同时意味着开启垂直同 步V-sync )。虽然这不是一个所 有的游戏都有的选项— —但它真的很必要要。 我们现在来说为什么要 开启三重缓冲以及为什 么开发商应该支持它。
对大多数游戏玩家来说 ,当涉及到任何关于垂 直同步(V-sync )的时候 ,都会在驱动程序或游 戏中关闭它。事实上, 我们做评测时也会这样 做,因为它使我们更清 楚地看到游戏的真实性 能。而那些喜欢打开垂 直同步的玩家,则是为 了避免在某些情况下发 生视觉“撕裂”效果。
我们想尝试一些不同的 写作方式。下文中将包 括两个投票调查,首页 以及文章的末尾。第一 个调查报告的目的反馈 我们的读者对垂直同步 、双重与三重缓冲的了 解程度。
这个投票结果取之于2 009年6月27日下 午5点
看完正文后后,我们的 读者可以参与另一个投 票,其目的是本文对读 者的影响是否会左右将 来的游戏设置。
首先将是审视一下双重 缓冲和垂直同步的概念 ,然后我们会谈论三重 缓冲。对于那些执着于 细节的读者(需要更多 的有说服力的证据), 我们将提供丰富的插图 更深入的剖析每种方法 。
什么是双重缓冲,垂直 同步和三重缓冲?
当电脑需要在显示器上 显示东西时,它按照它 的想法画一幅需要显示 的图像(我们称之为缓 冲区Buffer)并 传输给显示器。在过去 ,只有一个缓冲区并不 断的被电脑绘制和发送 给显示器。这种做法有 一些优势,但也有非常 大的缺点。最值得注意 的是,当物体在屏幕上 进行了更新,他们往往 会导致闪烁。
计算机在绘制的同时发 送内容。
所有插图感谢劳拉.威 尔逊提供。
为了解决同一缓冲区内 绘制的同时又读取的问 题,使用双重缓冲,就 成了最经济的方式。双 重缓冲背后的原理是: 计算机只绘制一个缓冲 区(所谓的“后部”缓 冲),同时发送另一个 缓冲(所谓的“前部” 缓冲)到屏幕上。当计 算机完成绘制后部缓冲 时,图像绘制程序会执 行缓冲区“交换”。这 种交换不会移动任何东 西:唯一的改变是交换 两个缓冲器的名称,前 部缓冲区成为后部缓冲 区的同时后部缓冲区成 为前部缓冲区。
计算机绘制后部缓冲, 前部缓冲发送给显示器 。
经过缓冲交换,程序可 以开始起在新的后部缓 冲区绘制同时电脑传送 新的前部缓冲区给显示 器,直至下一次缓冲区 交换发生。从此一切都 和谐了,恩,大多数情 况下如此。
这种形式的双重缓冲, “交换”随时可能发生 。这意味着,在电脑发 送数据给显示器的同时 ,就可能发生“交换” 。在这种情况下,(同 一帧下)其余的画面根 据新的前部缓冲器进行 显示。如果新前部缓冲 内容与旧的前部缓冲相 差很大,就会观察到一 种视觉上的“撕裂”感 。这种类型的问题,常 常出现在高帧率的FP S游戏中,特别是转角 处快速运动时看到。由 于快速运动,每帧有很 大的不同,当“交换” 发生在前后差异很大的 场景绘制途中,就会被 察觉到同时干扰人的视 觉感受。
最常见的做法是等待显 示器准备充分时“交换 ”缓冲器。显示器准备 充分意味着在完成绘制 完上一幅图像后刚好赶 上下个垂直刷新周期将 会开始。所以同步缓冲 区交换与垂直刷新被称 作垂直同步 。
开启垂直同步确实能修 复图像“撕裂”,它同 时会设置游戏的内部帧 率的最大值与显示器的 的刷新率一致(大多数 液晶面板通常是60H z)。这可能会牺牲的 性能:如果游戏不能保 持在每秒60帧的运行 时,(图像绘制程序) 会人为的增加延迟到图 像帧输出之间来达到同 步效果。哪怕是每一帧 所需的绘制时间超过1 6.67毫秒一点点( 1/60秒)都可能导 致性能可减少将近一半 。在这种情况下,帧速 率将下降到每秒30帧 ,尽管游戏的运行速度 极其接近60帧 。消除画面撕裂和保持 帧数一致,确实有助于 增加游戏流畅度,这是 单纯的双重缓冲模式无 法提供的。
同时开启垂直同步后的 输入延迟将会成为更加 严重的问题。这是因为 人为加入的延迟增加了 实际发生的事情(当帧 被绘制时)和最终显示 在屏幕上的画面的区别 。输入延迟始终存在( 我们不可能在绘制的瞬 间实时的反映变化), 但诀窍是,尽量减少它 。
我们目前的选择一个是 只进行双重缓冲但是会 导致解决画面撕裂问题 ,二是进行垂直同步的 双重缓存但是会影响性 能和输入延迟。但是不 要担心,有一种选择, 结合了两者的优点,既 不牺牲画面质量也不会 影响真实的性能。这种 选择就是三重缓冲。
计算机在发送前部缓冲 时可以有两个后部缓冲 区供使用。
光看这个名字就已经很 明显了:三重缓冲使用 三个缓冲区。这种额外 的缓冲区使计算机有足 够的空间来锁定一个正 被送往显示器的缓冲区 (以避免撕裂),同时 也不限制图像的绘制速 度(就算是有一个缓冲 区被锁定,也能来回绘 制剩下的两个缓冲区) 。软件来回绘制两个后 部缓冲器,当每一次刷 新时,前部缓冲区就与 最近完成的那个后部缓 冲区交换。这确实需要 一些额外的图形卡存储 空间(大约15到25 M之间),但与现代的 图形卡动辄512MB 显存来说这不构成什么 问题。
换言之,有了三重缓冲 我们获得了不开启垂直 同步时高效的性能和相 似的低输入延迟,同时 还实现了开启垂直同步 时的图像质量。
现在,重要的一点是, 当你看开启了三重缓冲 游戏的“帧数”时,你 将不会看到实际的“性 能”。这是因为帧计数 器像FRAPS这种只 能计算前部缓冲(就是 目前正在被显示器绘制 的那个缓冲)换出的次 数(即是我们通常所说 的广义上的“帧数”) 。在双重缓冲时,数据 显示在每个帧绘制并被 显示器显示的时候(也 就是说,如果另一帧在 下一次刷新前绘制好了 ,它可能不会显示出来 )。而三重缓冲,前部 缓冲在每个刷新周期最 多只“交换”一次 。
FRAPS软件仍在幕 后的两个后部缓冲区上 绘制时间。这意味着一 旦发生前部缓冲区交换 ,与开启垂直同步的双 重缓冲不同,我们并没 有加入人为的延迟。同 时也异于没有开启垂直 同步的双重缓冲 ,一旦我们开始传输一 个完整绘制好的帧给显 示器时,我们不会在中 途切换到另一个帧去。
最后讲一个三重缓冲会 导致的问题。如果一个 帧只比刷新完成晚很小 一点点就被生成出来, 在无垂直同步的双重缓 冲情况下 ,将在屏幕上方附近产 生画面撕裂,而其余部 分则会比三重缓冲更准 确的反应实时变化。即 使在这种情况下,但至 少帧的部分的画面元素 双重缓冲和三重缓冲是 一致的,同时三重缓冲 的延迟也非常难以察觉 ,至少比开启了垂直同 步的双重缓冲延迟问题 好得多。即使你认为这 是无垂直同步的双重缓 冲模式的优点,这优点 也是建立在很小几率( 不影响视觉的画面撕裂 )之上。
让我们带着这些理论通 过例子来比较这三种绘 制方式。
深度挖掘:疾驰的骏马 为例
比起一堆数学计算和传 统的时间图标,我们决 定采用一个更加直观的 表现形式。在图表中, 我们会给大家演示随着 时间电脑实际的生成的 图像以及最终被显示器 显示出来的图像。希望 这会有助于说明这些方 法数量和质量之间的差 别。
我们使用的是一个已有 的(来自维基百科上面 的动画)的“游戏”例 子:渲染一匹驰骋在屏 幕上的马。最基础的一 点是,我们的(显卡对 )游戏绘制的速度比我 们的显示器刷新率高5 倍(在一次缓冲区交换 发生时它可以渲染5幅 不同的图像)。在绘制 每帧性的一致性上是虚 构的,因为一些(复杂 )帧将比另一些(简单 帧)需要更长的时间来 绘制。我们去除掉这些 变量以免使得的复杂性 增加。我们这里以60 Hz的刷新率和300 FPS游戏性能为基础 讨论的时间和延迟,但 我们并不想把图像绘制 得太复杂。显然,这是 一个理论上的例子,但 它确实解释清楚了背后 发生的事情。
首先,我们来看看关闭 垂直同步时的双重缓冲 。在这种情况下,缓冲 区会在每一个图像绘制 好后交换。这会导致最 新的图像覆盖先前图像 的局部。以下就是在这 种情况下它看起来样子 :
很好的性能 ,但画质不佳。
时间轴标记0至15 ,每两个标记之间为一 个步骤,每个步骤是3 .33毫秒。时间轴上 每个缓冲区在3.3毫 秒间隔期间就有一张图 片,这张图片实时的显 示了骑手和马的动作。 底部的大型图片这代表 着每个垂直刷新周期在 显示器上显示出来的图 像。这就是我们在眼睛 说看见的实际图像。其 他(未绘制)帧的价值 就在于最小化了输入延 迟。
我们当然可以看到,在 这个极端的情况下,画 面撕裂可能是什么样子 。在这个快速运动的例 子中,我选择了只对合 成其中三帧的动画,但 在实际现实中可能更多 也可能更少。图像的宽 度反映了实际中图形硬 件传输图像给显示器绘 制时所占用的时间。绘 制的过程比刷新周期时 间要少一些,由于我不 是很精通显示器技术, 所以具体是多少时间我 无从得知。按照我的假 设,我用了大约一半的 时间从发送帧到显示器 显示出来(因此三个帧 的部分被显示出来)。 。如果我不得不猜测的 话,我想我高估发送帧 到显示器所花费的时间 。
对于上述情况, FRAPS将会显示3 00FPS,但实际人 们得到完整显示的图像 帧率仅仅只达到刷新率 的最大值(在这个例子 中, 60帧每秒)。一个帧 完成渲染并开始在屏幕 上绘制的延迟(这是输 入延迟)将会小于3. 3毫秒。
当我们打开垂直同步, 画面撕裂消失了,但我 们的实际性能下降并且 输入延迟上升。以下是 我们所看到的。
优良的画质,但糟糕的 性能和输入延迟。
如果我们考虑所有这些 图像都是一样的并且渲 染的耗时都是一致的, 我们就可以看到渲染“ 背后”的真实情况。在 我们的第一幅图中没有 撕裂的情况出现,但我 们付出代价是过时内容 。此外,除了报告实际 帧率为60FPS。计 算机最终少做了大量的 工作,当然,最大的牺 牲就是显示器每秒钟最 多显示60幅图像。
这时,我们为了消除画 面撕裂的代价就是延迟 从最多3.3毫秒增加 到13.3毫秒。对于 开启垂直同步刷新率为 60Hz的显示器,渲 染完成并显示出来的延 迟将会是完整的1/6 0秒(16.67毫秒 ),但是实际延迟有可 能会更高。由于在前部 缓冲区交换完成前没有 更多的空间可以用来绘 制帧,而如果图形卡绘 制一幅图像的时间本身 就超过了一个循环周期 的情况下再开启锤子同 步将会更加严重的影响 延迟。
现在移步到三重缓冲, 我们可以看到它结合了 上面两种办法的优势。
两全其美。
在这里。我们输入延迟 降到了3.3ms,同 时消除了画面撕裂。我 们的实际性能回到了3 00FPS,当然这未 必能从只监视前部缓冲 的软件统计上显示出来 。再次,每秒钟在显示 器上最多只显示60幅 图像,但是这60幅图 像都是在刷新周期前最 新绘制出来的。
当然这其中有些帧无垂 直同步的双重缓冲时会 显得比三重缓冲“新” 一点,但是代价将会是 潜在的图像撕裂。从挑 剔的角度来看,如果你 没有看到双重缓冲下的 画面撕裂,那么那些重 新刷新的局部对前一帧 来说差异也并不明显。 换言之,只有当您看到 画面撕裂,你才体会到 这种方式(无垂直同步 的双重缓冲)信息反馈 及时的优势。但是,即 便信息反馈更为及时, 在伴随着画面撕裂的情 况下又有多大的用处呢 ?
结论
综上所述。三重缓冲使 你有了开启/关闭垂直 同步时的双重缓冲所有 好处 。我们得到了流畅而且 没有撕裂的帧。这些帧 只在刷新时才被交换至 前部缓冲,它们还拥有 近似关闭垂直同步的双 重缓冲时那样低的输入 延迟。尽管“性能”并 没有得到正确的显示( FRAPS),启用三 重缓冲时,图形硬件依 然同未开启垂直同步的 双重缓冲模式一样辛勤 工作。三重缓冲确实要 占用更多的图形卡显存 ,但对现代的硬件来说 ,这算不上什么问题。
概括一下,从我们前面 的例子里取出三幅帧来 进行横向比较。
三重缓冲
双重缓冲
垂直同步下的双重缓冲
我们已经提出了定性和 定量的论点论据以支持 三重缓冲。所以,现在 的问题是:这些数据有 意义吗?人们会比阅读 这篇文章之前更愿意开 启三重缓冲吗?让我们 来看看答案。
这个投票结果取之于2 009年6月27日下 午5点
无论结果如何,我们真 心希望本文有助于解释 一个经常被忽视的选择 。虽然它我们评测时来 说没有什么意义,但三 重缓冲是实用至上的。 希望我们的展示能帮助 我们的读者理解为什么 他们应该给三重缓冲一 个机会。
我们也希望更多的开发 商将三重缓冲作为游戏 的默认选项,因为它会 给那些注重画质和性能 的玩家提供最好的游戏 体验。目前只有一小撮 游戏把三重缓冲作为游 戏的可选项, NVIDIA和AMD 的驱动程序目前只允许 强制OpenGL游戏 开启三重缓冲。这确实 需要改变,因为现在没 有任何理由不让三重缓 冲流行起来。
更新:在评论中有很多讨论涉 及到了我们在前文所谈 到的“页翻转”(Pa ge flipping)和 实施“预先渲染队列” (Render ahead queue)的差异。 在预渲染队列中,帧不 会被丢弃。这意味着, 如果队列已满,实际显 示的画面会有更大的延 迟。微软并没有在Dire ctX中实现三重缓冲 ,而是使用了这种预渲 染队列(从0到8张, 3是默认值)的方式。
他们之间的主要技术差 别在于“是否丢弃过时 的帧”。预渲染队列强 制旧的帧显示出来。队 列可以帮助平滑快速帧 (简单帧)和慢速帧( 复杂帧)之间的差异。 而代价就是更大的延迟 (队列中的帧越多,就 需要更多的时间去清空 队列同时也让输入延迟 更大) 。
为了保持画面流畅同时 减少输入延迟,就必须 维持一个限额的帧数目 作为缓冲,同时丢弃掉 那些过时的帧。这需要 相当的智能调度程序来 管理,具体操作细节已 经超出了本文所讨论的 范围。
一些游戏开发商提供了 一个很小的预渲染队列 ,并称其为三重缓冲( 因为它使用3个缓冲空 间,微软对Direc tX预渲染队列的定义 是可以最多提供8个空 间) 。当然不能简单的指责 他们混淆是非,因为这 个话题本身就有太多容 易混淆的地方,而在某些特殊情况下(实 际帧数小于或等于刷新 率时)它起到的效果也 确实接近于三重缓冲( 但是在实际帧数高于刷 新率时就大大不同,其 输入延迟甚至高于垂直 同步时的双重缓冲效果 )。
这两种技术都允许显卡 已经完成一帧的渲染后 在等待垂直同步时继续 工作。当使用双重缓冲 (并没有使队列) ,当垂直同步启用后, 每当下一帧绘制完毕, 显卡就会停止工作,这 样就造成了实际性能的 下载。
当垂直同步关闭时,完 成了双缓冲所需的任务 后,通过提供一个预渲 染队列就能用来平滑帧 输出速度,但是一些过 时的帧也被保留下来。 这样可以保持帧率平稳 而不会出现大幅的变化 ,但(即使无垂直同步 的双重缓冲)会增加画 面延迟和输入延迟。即 使没有开启垂直同步, 预渲染队列也是多GP U系统高效工作所必需 的。
因此,本文既是针对游 戏玩家,也是为了开发 者。如果你正在实施预 渲染队列(又名翻转队 列Flip queue),请不要 把它称为“三重缓冲” ,因为这应留给我们前 文所介绍的技术,以减 少混乱。目前很多把“ 三重缓冲”作为选项的 游戏,实际上是在用预 渲染队列。我们认识到 这可能会导致的混乱, 我们非常希望这篇文章 和讨论有助于缓解这个 问题。
译注
本文交代了目前广泛用 于光栅化图像中的图像 在显卡和显示器之间传 递时使用的输出缓冲技 术,深入挖掘了3种常 见技术的特征,并提出 游戏中应该广泛使用三 重缓冲。三重缓冲虽然 是个好技术,但是必须 要游戏开发时就引入。 微软并没有在Dire ctX中内置三重缓冲 的支持,而是提供了一 个预渲染队列(见上文 的补充更新),并不完 全等同于三重缓冲,在 此我再补充一点其他地 方找到的资料:
1.关于双重缓冲导致 的画面撕裂现象具体截 图:
来自于于Doom3
2.关于原文所用到的 动画:
来自于于wikipe dia
3.应用了三重缓冲的 游戏例子:
大量使用iD OpenGL引擎的游 戏,如FEAR
对大多数游戏玩家来说
我们想尝试一些不同的
这个投票结果取之于2
看完正文后后,我们的
首先将是审视一下双重
什么是双重缓冲,垂直
当电脑需要在显示器上
计算机在绘制的同时发
所有插图感谢劳拉.威
为了解决同一缓冲区内
计算机绘制后部缓冲,
经过缓冲交换,程序可
这种形式的双重缓冲,
最常见的做法是等待显
开启垂直同步确实能修
同时开启垂直同步后的
我们目前的选择一个是
计算机在发送前部缓冲
光看这个名字就已经很
换言之,有了三重缓冲
现在,重要的一点是,
FRAPS软件仍在幕
最后讲一个三重缓冲会
让我们带着这些理论通
深度挖掘:疾驰的骏马
比起一堆数学计算和传
我们使用的是一个已有
首先,我们来看看关闭
很好的性能 ,但画质不佳。
时间轴标记0至15 ,每两个标记之间为一
我们当然可以看到,在
对于上述情况, FRAPS将会显示3
当我们打开垂直同步,
优良的画质,但糟糕的
如果我们考虑所有这些
这时,我们为了消除画
现在移步到三重缓冲,
两全其美。
在这里。我们输入延迟
当然这其中有些帧无垂
结论
综上所述。三重缓冲使
概括一下,从我们前面
三重缓冲
双重缓冲
垂直同步下的双重缓冲
我们已经提出了定性和
这个投票结果取之于2
无论结果如何,我们真
我们也希望更多的开发
更新:在评论中有很多讨论涉
他们之间的主要技术差
为了保持画面流畅同时
一些游戏开发商提供了
这两种技术都允许显卡
当垂直同步关闭时,完
因此,本文既是针对游
译注
本文交代了目前广泛用
1.关于双重缓冲导致
来自于于Doom3
2.关于原文所用到的
来自于于wikipe
3.应用了三重缓冲的
大量使用iD OpenGL引擎的游