似乎大多数人建议只使用 2 或 3。这仅仅是因为超过 3 占用了太多的处理能力或其他什么(请原谅我对此有点陌生)?在什么样的程序中你会使用超过 3 个缓冲区?
2或3适用于我的程序,我只是好奇。
似乎大多数人建议只使用 2 或 3。这仅仅是因为超过 3 占用了太多的处理能力或其他什么(请原谅我对此有点陌生)?在什么样的程序中你会使用超过 3 个缓冲区?
2或3适用于我的程序,我只是好奇。
实际上,一旦您知道缓冲策略的好处,它就很容易理解。让我们简要看看这三种情况下会发生什么。
在单缓冲中,您只有一个显示器可以写入图像数据。相比之下双缓冲有两个display,front buffer和back buffer。
通常,应用程序的渲染和逻辑过程被拆分并并行运行(例如监视器和图形卡)。假设渲染过程有一个轮询率,每 15 毫秒在监视器上显示一个图像。想象一下,逻辑过程当前正在执行一些图像操作(画一个圆圈),但目前还没有完成(圆圈只画了一半)。在单缓冲中,您现在将在屏幕上看到一个半圆,因为渲染过程会显示未完成的图像。
在双缓冲中,逻辑进程只会写入后台缓冲区,并且只有在它结束了绘图过程时,它才会将后台缓冲区标记为已完成。然后将后台缓冲区的内容与前台缓冲区交换,渲染过程现在将显示完成的图像,您将看不到任何伪影。
所以双缓冲的优点是用户不会看到任何伪影,也不会体验到闪烁等东西。然而,这是以增加运行时间(交换操作)为代价的,尤其是增加了空间成本(整个图像的 2 倍)。
现在,虽然三重缓冲的成本更高(3 倍图像空间),但它会加快处理速度。这里有两个 后缓冲区和一个 前缓冲区。
假设您使用双缓冲,并且当前您正在将后缓冲区交换到前缓冲区,因为您刚刚完成了绘图操作。这可能需要一些时间,同时您的图形卡(非常快 - 比交换缓冲区的软件代码快)可以开始下一个绘图操作,但由于缓冲区被阻塞,它不能。
使用三重缓冲,显卡现在可以开始绘制到另一个缓冲区,因为一个后台缓冲区始终是空闲的,并且不涉及任何交换机制。
既然我们知道事情是如何工作的,那么为什么您看不到具有超过3 个缓冲区的缓冲解决方案也很清楚(至少在普通应用中没有) - 从一般概念的角度来看,它根本没有任何好处。
例如,在处理 3D 虚拟现实内容(立体图像)时,可以看到缓冲区数量的增加,您可以分别对左通道和右通道使用双缓冲,最后总共使用四通道缓冲。
最后一点, vsync意味着将前后缓冲区的交换与显示器的轮询率同步,以最大程度地减少撕裂效应。