zoukankan      html  css  js  c++  java
  • 画面撕裂

    1 什么是画面撕裂:

    画面撕裂(ScreenTearing)是指显示器把两个或更多的影格(frame)显示在同一画面上。屏幕的更新频率是固定的,通常是60Hz。现在显卡效能大幅提高,输出的帧率可以非常高,如果显卡的输出高于60fps,两者不同步,画面便会撕裂。

    垂直同步:VSync是(Vertical Synchronization)的简称。主要的思路是将你的FPS和显示器的刷新率同期起来。其目的是避免一种称之为"撕裂"的现象。

    垂直同步(Vertical Synchronization, Vertical Sync,简写为VSync),主要是由于显像管的物理限制而产生的,这一点在讨论刷新率章节中已经指出了。CRT显示器必须通过不断照亮屏幕上的荧光粉来显示图像,这是基于显示器电子枪移动速度的。每次CRT显示器重画整个屏幕的时候,内部的电子枪将从屏幕底部移动到指向屏幕的左上角的点,准备'重画'所有从屏幕左上角到右下角的扫描线,等画完后,再从头准备下一次刷新。我们把为了刷新屏幕,电子枪从屏幕底部移动到顶部的时间叫做垂直空白间隔(Vertical Blanking Interval,VBI)。

    在显卡上启用VSync将告诉您的显卡会与您的显示器进行同步。这意味着显卡只有当显示器说它已经准备好重画整个屏幕的时候--例如在VBI期间,显卡才被允许交换其帧缓存并将一个新的帧送往显卡。然而,您的显卡和显示器之间却不一定非要同步不可;在VSync被禁用的时候,他们仍然可以正常运行,但是当垂直扫描被禁用,您就可以体验一种被称为撕裂(Tearing)的现象,这正是因为您的显卡和显示器的行为是没有进行相互之间的限制的。

    虽然概念上的VSync起源自CRT屏幕,但它适用于液晶显示器,下面我们将来解释为什么这么说的原因。

    撕裂(Tearing)

    如果禁用的VSync,您的显卡和显示器将会不同步,这是一个不幸的事实。每当你的FPS的超过屏幕的刷新率时(如在60Hz的屏幕上FPS为120),或在你的显卡的工作速度超过显示器的任何时候,显卡将在帧缓存区中产生比显示器实际可以显示的帧数更多的帧,所以最终的结果是,当显示器在VBI期间从显卡的主缓冲区获取一帧新图像的时候,这一帧可能实际上是由两个或者更多不同的帧相互重叠在一起而产生的。在屏幕上可能表现为每当有任何运动画面出现的时候,都会略为不对齐或'部分撕裂'--因此它被称为撕裂。下面的例子就是在模拟这种情况。仔细看看小便器和水槽--其中部分由于撕裂而产生了不对齐:

     

    撕裂给视觉上带来的影响主要取决于您的显卡和显示器之间的不同步到底有多严重,但通常来说,较高的FPS或更快的动作游戏中,如迅速扭转的时候,这种影响将的更明显。这是因为在这些情形下,新老帧重叠部分的内容的区别会更加明显。

    撕裂并不会对您的显卡或显示器有任何损害。它只是说明了当显卡和显示器之间不同步的时候,显示器在物理上为了跟上显卡的运行速度的极限。以在60Hz的显示器上运行120FPS为例,你的显示器任何一秒种内最多只能刷新60个完整的帧,所以其他60帧几乎是被浪费了,解决办法就是许多帧相互重叠而因此产生了撕裂。因此,即使您不想要启用的VSync,您也应该在游戏图形设置中进行相关的设置,以减少您的FPS,而使之接近你的刷新率。这将帮助您得到更多的帧数并同时减少撕裂。这看起来很酷,因为您将会有很高的帧率,但是当VSync被禁用的时候,你仍然可以看到有帧数上的浪费并且会引起图像故障。

    不管是CRT或LCD显示器,都会出现撕裂现象,因为两者都是为了同一兼容性目的而工作的--请参看“响应时间”这章中关于解释液晶显示器为什么会表现为CRT显示器一样。

    FPS和垂直同步

    当垂直同步被禁用,你的FPS和刷新率之间就没有任何关系了。这使您的显卡可以按照它想的速度那样快速的工作,将帧尽快地发送到显示器上进行显示。当然显示器是否能真正正确地显示所有这些帧则是另一回事了,事实上我们已经讨论过这个问题了。显然,如果停用VSync可能导致图形故障(graphical glitches),但这些故障可能很轻微,不能因为产生了一些撕裂而浪费显卡的性能,所以总是将VSync打开?再次强调一下,事情往往并不那么简单。

    当垂直同步被启用,发生的事情就是你的显卡被告知要等待您的显示器发出已经能够显示新的一帧图像的信号后,再提供一帧新的图像。显卡不能再领先了,在它准备好后,它不能将新的帧叠加在旧的帧上了--它必须在显示器说它已经在VBI期间准白好刷新它自己后,才提供一个单一的帧。这样做首先最明显的影响是,在您的FPS将被限制在目前的刷新速率上限下。因此,如果你设置的刷新率是60赫兹,你的帧率现在最高只能达到每秒60帧。这本身是不是一个真正的问题,因为每台显示器至少可以达到在任何分辨率下60Hz的刷新率,这一点在“每秒帧数”这章已经讨论过,如果你的系统可以在一个游戏中产生持续的60FPS,那么在任何游戏中你都会得到平滑自然的动作了。

    然而,有一个启用VSynci会遇到的最根本的问题,就是它会大大减少您的整体帧率,往往使得你的FPS降到刷新率50%。这是一个很难解释的概念,但还是要花时间讲解一下。我们知道,当VSync被启用的时候,你的显卡几乎就成为你的显示器的奴隶了。如果在任何时候你的FPS,略低于刷新速率的话,你的显卡绘制一帧的时间将会比您的显示器刷新本身时间要长。因此,每当第二次刷新的时候,您的显卡就错过了生产新帧的时间。这意味着,无论它的主缓冲和后备缓冲区都被填满了,新的图像信息将无处可放,因此它必须被闲置,等待下一次更新时它可以将它最近产生的帧上传到缓冲区中,并且开始将后备缓冲区清除的工作。这就造成了当你的FPS低于刷新率的时候会将近损失一半的帧率。

    只要你的显卡提供帧的速度比你的显示器自动刷新的速度快,启用VSYNC就不会降低你的平均帧率。所有这一切会发生,只是由于你的FPS的最高上限被限定在屏幕的刷新率。但是,由于现代的显示器刷新率都是60Hz以上,而在大多数游戏在你需要的分辨率和设置下是很难实现稳定的60fps的,所以启用VSYNC通常最终减少您的FPS。幸运的是,因为这个问题是由于没有缓冲区可以用来填补过多的帧而产生的,所以有一个解决方案,就是使用三缓冲。然而这不是一个简单的解决办法,更详细的解释请参看“三重缓冲”部分。

  • 相关阅读:
    动态规划算法-3
    动态规划算法-2
    动态规划算法-1
    滑动窗口算法-3
    央行副行长提示金融风险:地方偿债高峰期到来
    银行卡换“芯” 更要银行换心
    破解IT运维成本困境,专业化分工是妙方
    php连接mysql
    ajax原生验证用户名是否存在
    ajax跨域问题
  • 原文地址:https://www.cnblogs.com/8335IT/p/9072705.html
Copyright © 2011-2022 走看看