我想了解是什么原因导致屏幕撕裂。假设显示器可以即时更新其每个像素。那么我想象刷新将像这样工作:
- 监视器决定开始刷新
- 它查看 GPU 当前正在发送的任何帧。
- 它以原子方式即时更新所有像素。
有了这种程序,似乎完全不可能出现屏幕撕裂,完全忽略刷新率和 FPS。每次只绘制一张图像。
现在我知道 CRT 显示器与扫描枪(或任何名称)的工作方式并非如此。但我的印象是较新的显示器技术并非如此。它们实际上是逐渐更新像素,而不是一次性更新像素吗?
答案1
步骤 2 和 3 假设所有帧数据都以即时和原子方式传输到显示器,但事实并非如此。“哑”显示器永远不会“看到”(或缓冲)完整视频帧。显示器的工作原理与我们使用扫描电子束绘制图片时的原理相同。更时髦的电视可能会缓冲图像并进行帧间处理,但计算机显示器可能不会。
显示器看到的只是来自显卡的数据流。显示器会收到各种初步信息,告诉它数据流的格式,因此显示器会获得时间信息、水平线数量、垂直线数量和颜色格式的详细信息,但实际上它获得的只是一长串像素颜色数据。
您的步骤 2 和 3 实际上发生在显卡中,并且仅当您启用垂直同步时,步骤 3 才会“出现”。
在视频帧的任何一点,GPU 都可以决定将其视频缓冲区交换为新图片,并从缓冲区中的该点继续发送数据。如果未启用垂直同步,则它将继续从旧缓冲区中停止的同一点向显示器发送新缓冲区数据。这就是您的“撕裂”点。
如果您启用了垂直同步,那么 GPU 将等待发送完整帧后再切换缓冲区,在这种情况下您将不会看到“撕裂”。
答案2
屏幕撕裂是视频显示中的一种视觉伪影,即显示设备在单个屏幕上显示来自多个帧的信息。当设备的视频源与显示器的刷新率不同步时,就会出现这种伪影。
来源:维基百科。
所有显示器(LCD 和 CRT)都以已知且可预测的时间在时钟上刷新。各种技术都允许显卡知道此时钟周期,以便 GPU 可以在最佳时间发送数据,让显示器接收数据并显示下一屏幕的像素。
这通常称为刷新率,或者在某些电视上,您会看到广告宣传的 Hz(即每秒周期数)数字。目前最常见的可能是 60Hz,即每秒 60 个周期。不过 120Hz 变得越来越常见。
上面提到的各种同步技术一般都是为了防止画面撕裂而采用的,但它们的解决能力通常都有限制。