垂直同步就是使游戏引擎的渲染速度与显示器的刷新速度同步
预备知识
在理解为什么游戏的FPS(帧率)与屏幕的刷新率差距越大,跳帧(帧丢失)问题就会越严重之前,我们需要了解一些相关的概念。
-
FPS(Frames Per Second): 指游戏在一秒钟内呈现的图像帧数。它表示了游戏画面的流畅度,通常以数字(例如60、120等)表示。
- 屏幕的刷新率: 指屏幕每秒更新图像的次数,通常以赫兹(Hz)表示。常见的屏幕刷新率包括60Hz、120Hz和144Hz等。
- 当游戏的FPS与屏幕的刷新率相匹配时,即游戏的帧率与屏幕的刷新率相等或接近时,画面会显得更加平滑。但当它们之间的差距越大,跳帧问题就会越严重。
问题出现
跳帧问题的原因如下:
-
帧丢失:当游戏的帧率高于屏幕的刷新率时,屏幕无法及时显示所有的游戏帧,导致部分帧丢失。例如,如果游戏的帧率是120FPS,而屏幕的刷新率是60Hz,屏幕每秒只能刷新60次,因此会丢失一半的帧,导致画面不连续。
-
画面撕裂(Screen tearing):当游戏的帧率与屏幕的刷新率不同步时,可能会出现画面撕裂问题。画面撕裂是指屏幕上不同位置的两个或多个部分同时显示不同的帧,给人一种画面不协调的感觉。
解决方法
垂直同步(V-Sync)和自适应同步(Adaptive Sync)是用于调整游戏帧率和显示器刷新率之间匹配的技术,它们的工作原理略有不同。
- 垂直同步(V-Sync):
垂直同步是一种常见的技术,旨在解决画面撕裂问题。当启用垂直同步时,游戏的帧率将被限制为与显示器的刷新率相匹配。具体来说,游戏引擎将帧率锁定在显示器的刷新率,例如60帧/秒(FPS)与60Hz的显示器匹配。
这样做的结果是,游戏引擎会等待显示器完成上一帧的显示,然后再发送下一帧的图像。这种同步确保游戏的每个图像帧都完整地显示在屏幕上,避免了画面撕裂问题。然而,如果游戏的帧率无法达到显示器的刷新率,垂直同步可能会导致画面的卡顿或者输入延迟增加。
- 自适应同步(Adaptive Sync):
自适应同步是一种新的技术,旨在解决垂直同步可能引起的性能问题和输入延迟。其中,AMD的FreeSync和NVIDIA的G-Sync是两种常见的自适应同步技术。
自适应同步允许显示器的刷新率动态调整以匹配游戏的帧率,而不是固定地与显示器的刷新率相匹配。这样可以避免画面撕裂,并且在游戏帧率较低时仍然保持流畅的画面。
自适应同步的工作原理是,显示器和显卡之间通过特殊的通信协议进行沟通。当游戏引擎发送新的图像帧时,显卡会告知显示器何时开始刷新下一帧。这样,显示器的刷新率会根据显卡的输出动态调整,以确保最佳的匹配。
垂直同步又称场同步(Vertical synchronization),从CRT显示器的显示原理来看,单个像素组成了水平扫描线,水平扫描线在垂直方向的堆积形成了完整的画面。
垂直同步信号的生成实际上是由显卡中的其他电路和算法来完成的,而不是由显示器直接发送。
显示器上的所有图像都是一线一线的扫描上去的,无论是隔行扫描还是逐行扫描,显示器,都有2种同步参数——水平同步和垂直同步。 1.水平 水平同步脉冲(Horizontal synchronization pulse, H-sync)加在两个扫描行之间。它是一个短小的脉冲,在一行扫描完成之后,它就会出现,指示着这一行扫描完成,同时它也指示着下一行将要开始。 水平同步脉冲出现后,会有一小段叫horizontal back porch的时间,这段时间里的像素信号是不会被显示出来,过了这一小段时间之后,电子枪就开始扫描新的一行,将要显示的内容扫描到显示器上。 2.垂直编辑 垂直同步脉冲(Vertical synchronization, V-sync)是加在两帧之间。跟水平同步脉冲类似,但它指示着前一帧的结束,和新一帧的开始。 垂直同步脉冲是一个持续时间比较长的脉冲,可能持续一行或几行的扫描时间,但在这段时间内,没有像素信号出现。
当显卡生成图像数据时,它会通过显示接口(如HDMI、DisplayPort等)将这些图像数据发送给显示器。在这个过程中,显卡中的电路和算法会检测到显示器的刷新状态,并根据需要生成垂直同步信号。
具体来说,显卡中的电路和算法会监测显示器的垂直同步信号或者回扫信号。当显卡检测到显示器的回扫信号时,它会根据回扫信号的信息来确定何时发送下一帧的图像数据。显卡会等待合适的时机,使得下一帧的图像数据能够与显示器的刷新周期同步。
一旦显卡决定发送下一帧的图像数据,它会通过显示接口将这些数据传输给显示器。显示器接收到这些图像数据后,会根据自身的刷新率和接收到的图像数据来进行显示。
所以,垂直同步信号的生成是由显卡中的电路和算法来控制的,并通过显示接口将图像数据发送给显示器。显示器根据接收到的图像数据和自身的刷新率来进行显示,以实现图像的同步和平滑显示。
什么是垂直同步
我们平时所说的打开垂直同步指的是将垂直同步信号送入显卡的3D图形处理部分,从而让显卡在生成3D图形时受垂直同步信号的制约。即:使游戏引擎的渲染速度与显示器的刷新速度同步。
只是玩游戏理解到这里就可以了
VR
对于VR来说有些流程不一样,详细参考:Oculus详述『延迟』问题及对应『帧渲染』解决方案
知识补充
every V blank和every second V blank是什么
“every V blank”和”every second V blank”都是术语,通常在电子显示器或视频设备的规格中使用。它们用于描述显示器的刷新率或帧率。
“every V blank”表示每个垂直空白间隔。在电子显示器中,垂直空白间隔是指两个连续帧之间的空白时间,用于显示器进行重新刷新和准备下一帧的内容。每个V blank之后,显示器将显示下一帧图像。
“every second V blank”表示每隔一个垂直空白间隔。这意味着显示器只在每个第二个垂直空白间隔之后显示下一帧图像,而在其他垂直空白间隔中保持不变。这可以用于降低帧率以节省资源或实现其他特定效果。
显示器重新刷新自身并准备显示下一帧图像:这个过程包括清除当前帧的像素信息,更新显示缓冲区的内容,并加载下一帧的图像数据。显示器还会执行其他操作,如调整亮度、对比度等参数,以适应新的图像。重新刷新和准备下一帧的内容是为了确保平滑的图像切换和连续的动画效果。通过在垂直空白间隔期间进行这些操作,显示器可以提供更高的帧率和更好的视觉体验。
总而言之,这些术语描述了显示器或视频设备的帧率设置和刷新模式,每个V blank表示每个垂直空白间隔刷新一次,而每隔一个V blank表示每隔一个垂直空白间隔刷新一次。
游戏中前置缓存、后置缓存、前置缓存交换是什么意思
在游戏开发中,前置缓存交换和后置缓存是与图像渲染和显示相关的两个概念。
前置缓存交换(Front Buffer Swap)指的是将已渲染好的图像从前置缓存(Front Buffer)切换到显示器进行显示的过程。前置缓存是一个用于存储即将显示的图像的缓冲区。当渲染完一帧图像后,它被存储在前置缓存中,但不会立即显示在屏幕上。
后置缓存(Back Buffer)是另一个缓冲区,用于存储下一帧即将要渲染的图像。在进行前置缓存交换之前,开发者通常会在后置缓存中进行渲染和处理。这样可以避免在渲染过程中直接影响到正在显示的图像。
当一帧图像渲染完成后,游戏引擎会执行前置缓存交换操作,将前置缓存中的图像与屏幕上正在显示的图像进行交换。这样,渲染的图像就会显示在屏幕上,同时前置缓存变成了新的后置缓存,供下一帧图像的渲染使用。
前置缓存交换和后置缓存的使用可以帮助避免画面撕裂等问题,并提供更流畅的图像显示效果。通过在后置缓存中进行渲染、处理和优化,可以确保图像在前置缓存交换时能够无缝地显示在屏幕上,提供更好的游戏体验。
前置缓存交换不能完全消除画面撕裂问题
但是尽管前置缓存交换和后置缓存可以帮助减少画面撕裂,但它们并不能完全消除该问题。以下是一些原因解释为什么垂直同步仍然有其用途:
-
画面撕裂的根本原因:画面撕裂是由于显示器的刷新率和游戏的帧率不同步导致的。前置缓存交换和后置缓存可以减少画面撕裂的发生,但它们无法解决刷新率和帧率之间的不匹配问题。垂直同步通过限制游戏的帧率与显示器的刷新率相匹配,确保每一帧都在垂直空白间隔期间刷新,从而消除画面撕裂。
-
省电和资源利用:垂直同步可以减少游戏引擎和显卡的工作负载。当游戏的帧率超过显示器的刷新率时,显卡会不必要地渲染更多的帧,这会浪费计算资源和能量。通过启用垂直同步,帧率被限制为显示器的刷新率,可以更有效地利用资源并降低功耗。
-
平滑的动画效果:启用垂直同步可以提供更平滑的动画效果。当帧率与刷新率同步时,每一帧都会在垂直空白间隔期间显示,这可以减少图像的不连续性和跳跃感。结果是视觉上更平滑的图像和动画。
尽管垂直同步有时可能引入一定的输入延迟,并在某些情况下导致画面卡顿,但它仍然是解决画面撕裂问题的一种可行方法。游戏开发者和玩家可以根据具体情况和个人偏好来决定是否启用垂直同步。
也就是说,当游戏的渲染速度比显示器的刷新速度慢时,前置缓存交换可以确保在图像渲染完成后再进行显示,从而解决了画面撕裂问题。
游戏引擎比显示器的刷新速度快时进行了前置缓存交换画面撕裂问题仍然可能发生原因
缓存交换是屏幕显示后的操作,后置缓存变成前置缓存后,可能由于游戏较快,存在两帧的图像而导致画面撕裂,具体来说,在前置缓存交换之前,后置缓存中的图像会成为前置缓存中显示在屏幕上的图像。当游戏引擎比显示器的刷新速率快时,就会出现下一帧的图像正在被渲染,而前一帧的图像仍在显示的情况,从而导致画面撕裂。
-
渲染帧完成:游戏引擎渲染一帧完整的图像,并将其存储在后置缓存(Back Buffer)中。
-
前置缓存交换:在前置缓存交换之前,后置缓存中的图像会成为前置缓存中即将显示在屏幕上的图像。
-
显示器刷新:显示器按照自身的刷新率进行刷新操作,以显示前置缓存中的图像。通常,显示器的刷新率是固定的,例如60Hz。
-
渲染速度快于刷新速度:如果游戏引擎的渲染速度比显示器的刷新速度快,就会发生如下情况:游戏引擎已经开始渲染下一帧的图像,而显示器仍在显示前一帧的图像。这导致屏幕上同时显示两个不同的图像,从而产生画面撕裂。
因此,当游戏引擎比显示器的刷新速度快时,即使进行了前置缓存交换,画面撕裂问题仍然可能发生。为了解决这个问题,可以使用垂直同步(V-sync)等技术来限制游戏引擎的渲染速度与显示器的刷新速度同步,从而消除画面撕裂。