尊天命,尽人事
分类: Android平台
2014-12-04 15:49:55
VSync是垂直同期(Vertical Synchronization)的简称。基本的思路是将你的FPS和显示器的刷新率同期起来。其目的是避免一种称之为"撕裂"的现象。再下面我将详细介绍这些内容。
每一台CRT显示器都有自己的刷新率。其单位是HZ.其数值是显示器每秒钟更新画面的次数。不同的显示器支持再不同分辨率下的不同刷新率。它的范围 可以从低到60高到100。注意它不是你游戏中所提到的那个FPS.如果你设置了一个特定的刷新率,显示器将一直按照这个速率刷新画面。甚至画面没有任何 的改变。液晶显示器就不同了。LCD的每个像素在被告知改变的时候将一直是亮着的。他们不需要刷新。但是因为VGA(或是DVI)的工作原理,LCD不得 不从显示卡那里按一定的速率得到新的新画面。这就是虽然LCD不必要更新,但是他还是有自己的刷新率。
现在,一个很普遍的误解就产生了。一些人认为解决这个问题的方法就是简单设置一个FPS的限制让FPS不超过显示器的刷新率,这样显示卡就不会超过75FPS,这样就可以了。真的吗?错!
在我解释为什么之前,让我来讲一下双倍缓冲。双倍缓冲一种用来减轻撕裂问题,虽然不是很完全。基本上来说你有一个显示缓冲和一个后备缓冲。当显示器 要显示画面的时候,就会从显示缓冲里“推出”显示画面。显示卡则在后备缓冲里描画另外一个新画面,当描画完成后则将新画面考入显示缓冲里。但是这个过程需 要时间,如果显示器的刷新在拷贝过程中进行的话,显示器上显示的仍然是个"撕裂"的画面。
这样看起来不错,但是让我们来看一个另外一个不同的例子。让我们假定你已经玩到了你最喜欢的游戏的最后一关,这个游戏有很好的图像.你显示器的刷新 率还是在75。但是你的FPS现在只有50了,比刷新率要低33%.这就意味着每次显示器刷新图像,你的显示卡只能画出下一桢画面的2/3。让我们看看它 是如何工作的。显示器刚刚更新,第一桢的画面已经拷贝到显示缓冲,第二桢的画面的2/3被写入后备缓冲,这时显示器重新刷新,它会第一次从显示缓冲里提取 第一桢的画面。然后显示卡开始完成的第二桢剩下的部分。但是它必须等待,应为再下一次刷新之前它是不会上传的。显示器再次刷新,显示器不得不第二次从显示 缓冲里提取第一桢的画面,然后第二桢的画面被写入显示缓冲。显示卡在后备缓冲中写入第三桢的2/3.等到显示器刷新,第一次从显示缓冲里提取第二桢的画 面,显示卡开始完成的第三桢剩下的部分。然后又是第二次从显示缓冲里提取第二桢的画面,然后第三桢的画面被写入显示缓冲。如此类推。这样4次显示器刷新, 我们只能的到2桢的画面。如果刷新率是75的话,我们只能得到35的FPS.很明显这个数值要低于显示卡可以带到的50FPS.这主要就是应为显示卡不得 不在描画后备缓冲上浪费时间。而在此过程中,后备缓冲上的画面是不能被拷贝到显示缓冲。理论上讲,双缓冲的VSync,FPS将是一组不连续的整数,其等于刷新率/n,n是正整数。也就是说,如果你的刷新率是60hz,你能得到的FPS只能是 60,30,20,15,12,10 等等。你可以注意到60到30是一个相当大的差距。只要的显示卡的FPS在60到30之间,你说得到的真实FPS都将只能等于30!
现在,你明白为什么有人不喜欢它了。让我们回到一开始的那个例子。你在玩你最喜欢的游戏,刷新率是75HZ,100FPS。你打开VSync.游戏就被限制在75FPS,没有问题,没有撕裂图像,看起来不错。你到了一个图像特别复杂的地方,在不用VSync的时候,你的FPS下降到了60左右。但是你打开了VSync, 你的FPS实际就只有37.5。这样你的游戏突然从75FPS变成了37.5FPS,不管37.5仍然很流畅但是你一定会注意到刷新率突然减少了一半。当 让如果以下变到25FPS的话,实际的现实率可能就只有17.5。本来还可以玩的游戏,就变成了幻灯片。这就是大家不喜欢它的原因。
我希望这篇文章是有用的,可以帮出你理解VSync的工作原理。(特别是不再犹豫是否打开VSync)总之,如果没有triple-buffering的情况下,如何权衡Vsync的FPS限制和消除撕裂画面带来的视觉感受,那将完全取决于你个人的喜好。
译者按:如果这篇文章的机理是正确的。triple-buffering也不是万能的,实际上就是把减少1/2变成了减少1/3而已,如果是FPS 恰好卡到了一定的数值的时候没有问题,一旦没有,那就绝对要损失FPS.所以对于那种FPS刚刚超过24的游戏,不管有没有triple- buffering,都应该关.