三重缓冲:为什么我们爱它
来源:互联网 发布:数据库设置主键 编辑:程序博客网 时间:2024/04/30 23:33
我们往往不愿过多讨论哪些选项在游戏中应该开启。相反,我们往往把重点放在我们的评测内容上。老实说,我们对玩游戏的建议设置与我们的评测设置非常相似,除了一个非常重要的选项:三重缓冲(这同时意味着开启垂直同步V-sync )。虽然这不是一个所有的游戏都有的选项——但它真的很必要要。我们现在来说为什么要开启三重缓冲以及为什么开发商应该支持它。
对大多数游戏玩家来说,当涉及到任何关于垂直同步(V-sync)的时候 ,都会在驱动程序或游戏中关闭它。事实上,我们做评测时也会这样做,因为它使我们更清楚地看到游戏的真实性能。而那些喜欢打开垂直同步的玩家,则是为了避免在某些情况下发生视觉“撕裂”效果。
我们想尝试一些不同的写作方式。下文中将包括两个投票调查,首页以及文章的末尾。第一个调查报告的目的反馈我们的读者对垂直同步、双重与三重缓冲的了解程度。
这个投票结果取之于2009年6月27日下午5点
看完正文后后,我们的读者可以参与另一个投票,其目的是本文对读者的影响是否会左右将来的游戏设置。
首先将是审视一下双重缓冲和垂直同步的概念,然后我们会谈论三重缓冲。对于那些执着于细节的读者(需要更多的有说服力的证据),我们将提供丰富的插图更深入的剖析每种方法。
什么是双重缓冲,垂直同步和三重缓冲?
当电脑需要在显示器上显示东西时,它按照它的想法画一幅需要显示的图像(我们称之为缓冲区Buffer)并传输给显示器。在过去,只有一个缓冲区并不断的被电脑绘制和发送给显示器。这种做法有一些优势,但也有非常大的缺点。最值得注意的是,当物体在屏幕上进行了更新,他们往往会导致闪烁。
计算机在绘制的同时发送内容。
所有插图感谢劳拉.威尔逊提供。
为了解决同一缓冲区内绘制的同时又读取的问题,使用双重缓冲,就成了最经济的方式。双重缓冲背后的原理是:计算机只绘制一个缓冲区(所谓的“后部”缓冲),同时发送另一个缓冲(所谓的“前部”缓冲)到屏幕上。当计算机完成绘制后部缓冲时,图像绘制程序会执行缓冲区“交换”。这种交换不会移动任何东西:唯一的改变是交换两个缓冲器的名称,前部缓冲区成为后部缓冲区的同时后部缓冲区成为前部缓冲区。
计算机绘制后部缓冲,前部缓冲发送给显示器。
经过缓冲交换,程序可以开始起在新的后部缓冲区绘制同时电脑传送新的前部缓冲区给显示器,直至下一次缓冲区交换发生。从此一切都和谐了,恩,大多数情况下如此。
这种形式的双重缓冲,“交换”随时可能发生。这意味着,在电脑发送数据给显示器的同时,就可能发生“交换”。在这种情况下,(同一帧下)其余的画面根据新的前部缓冲器进行显示。如果新前部缓冲内容与旧的前部缓冲相差很大,就会观察到一种视觉上的“撕裂”感。这种类型的问题,常常出现在高帧率的FPS游戏中,特别是转角处快速运动时看到。由于快速运动,每帧有很大的不同,当“交换”发生在前后差异很大的场景绘制途中,就会被察觉到同时干扰人的视觉感受。
最常见的做法是等待显示器准备充分时“交换”缓冲器。显示器准备充分意味着在完成绘制完上一幅图像后刚好赶上下个垂直刷新周期将会开始。所以同步缓冲区交换与垂直刷新被称作垂直同步 。
开启垂直同步确实能修复图像“撕裂”,它同时会设置游戏的内部帧率的最大值与显示器的的刷新率一致(大多数液晶面板通常是60Hz)。这可能会牺牲的性能:如果游戏不能保持在每秒60帧的运行时,(图像绘制程序)会人为的增加延迟到图像帧输出之间来达到同步效果。哪怕是每一帧所需的绘制时间超过16.67毫秒一点点(1/60秒)都可能导致性能可减少将近一半 。在这种情况下,帧速率将下降到每秒30帧,尽管游戏的运行速度极其接近60帧 。消除画面撕裂和保持帧数一致,确实有助于增加游戏流畅度,这是单纯的双重缓冲模式无法提供的。
同时开启垂直同步后的输入延迟将会成为更加严重的问题。这是因为人为加入的延迟增加了实际发生的事情(当帧被绘制时)和最终显示在屏幕上的画面的区别。输入延迟始终存在(我们不可能在绘制的瞬间实时的反映变化),但诀窍是,尽量减少它。
我们目前的选择一个是只进行双重缓冲但是会导致解决画面撕裂问题,二是进行垂直同步的双重缓存但是会影响性能和输入延迟。但是不要担心,有一种选择,结合了两者的优点,既不牺牲画面质量也不会影响真实的性能。这种选择就是三重缓冲。
计算机在发送前部缓冲时可以有两个后部缓冲区供使用。
光看这个名字就已经很明显了:三重缓冲使用三个缓冲区。这种额外的缓冲区使计算机有足够的空间来锁定一个正被送往显示器的缓冲区(以避免撕裂),同时也不限制图像的绘制速度(就算是有一个缓冲区被锁定,也能来回绘制剩下的两个缓冲区)。软件来回绘制两个后部缓冲器,当每一次刷新时,前部缓冲区就与最近完成的那个后部缓冲区交换。这确实需要一些额外的图形卡存储空间(大约15到25M之间),但与现代的图形卡动辄512MB显存来说这不构成什么问题。
换言之,有了三重缓冲我们获得了不开启垂直同步时高效的性能和相似的低输入延迟,同时还实现了开启垂直同步时的图像质量。
现在,重要的一点是,当你看开启了三重缓冲游戏的“帧数”时,你将不会看到实际的“性能”。这是因为帧计数器像FRAPS这种只能计算前部缓冲(就是目前正在被显示器绘制的那个缓冲)换出的次数(即是我们通常所说的广义上的“帧数”)。在双重缓冲时,数据显示在每个帧绘制并被显示器显示的时候(也就是说,如果另一帧在下一次刷新前绘制好了,它可能不会显示出来)。而三重缓冲,前部缓冲在每个刷新周期最多只“交换”一次 。
FRAPS软件仍在幕后的两个后部缓冲区上绘制时间。这意味着一旦发生前部缓冲区交换,与开启垂直同步的双重缓冲不同,我们并没有加入人为的延迟。同时也异于没有开启垂直同步的双重缓冲 ,一旦我们开始传输一个完整绘制好的帧给显示器时,我们不会在中途切换到另一个帧去。
最后讲一个三重缓冲会导致的问题。如果一个帧只比刷新完成晚很小一点点就被生成出来,在无垂直同步的双重缓冲情况下 ,将在屏幕上方附近产生画面撕裂,而其余部分则会比三重缓冲更准确的反应实时变化。即使在这种情况下,但至少帧的部分的画面元素双重缓冲和三重缓冲是一致的,同时三重缓冲的延迟也非常难以察觉,至少比开启了垂直同步的双重缓冲延迟问题好得多。即使你认为这是无垂直同步的双重缓冲模式的优点,这优点也是建立在很小几率(不影响视觉的画面撕裂)之上。
让我们带着这些理论通过例子来比较这三种绘制方式。
深度挖掘:疾驰的骏马为例
比起一堆数学计算和传统的时间图标,我们决定采用一个更加直观的表现形式。在图表中,我们会给大家演示随着时间电脑实际的生成的图像以及最终被显示器显示出来的图像。希望这会有助于说明这些方法数量和质量之间的差别。
我们使用的是一个已有的(来自维基百科上面的动画)的“游戏”例子:渲染一匹驰骋在屏幕上的马。最基础的一
对大多数游戏玩家来说
我们想尝试一些不同的
这个投票结果取之于2
看完正文后后,我们的
首先将是审视一下双重
什么是双重缓冲,垂直
当电脑需要在显示器上
计算机在绘制的同时发
所有插图感谢劳拉.威
为了解决同一缓冲区内
计算机绘制后部缓冲,
经过缓冲交换,程序可
这种形式的双重缓冲,
最常见的做法是等待显
开启垂直同步确实能修
同时开启垂直同步后的
我们目前的选择一个是
计算机在发送前部缓冲
光看这个名字就已经很
换言之,有了三重缓冲
现在,重要的一点是,
FRAPS软件仍在幕
最后讲一个三重缓冲会
让我们带着这些理论通
深度挖掘:疾驰的骏马
比起一堆数学计算和传
我们使用的是一个已有