在 java 中使用 createBufferStrategy() 时,拥有 2 个以上的缓冲区是否有帮助?有缺点吗?
When using createBufferStrategy() in java, does it help to have more than 2 buffers? Is there a downside?
似乎大多数人建议只使用 2 或 3。这是否只是因为超过 3 占用太多处理能力或其他原因(请原谅我对这个有点陌生)?在什么样的程序中你会使用超过 3 个缓冲区?
2 或 3 适合我的程序,我只是好奇。
实际上,一旦了解了缓冲策略的好处,它就很容易理解了。
让我们简单看看这三种情况下会发生什么。
在单缓冲中,您只有一个显示器可以写入图像数据。相反 double buffering 有两个 displays,front 和 back buffer.
通常应用程序的渲染和逻辑进程是分开的并且运行 并行(例如显示器和显卡)。假设渲染进程有一个轮询率,每 15 毫秒在监视器上显示一个图像。想象一下逻辑过程当前正在执行一些图像操作(画一个圆圈)但此刻尚未完成(圆圈只画了一半)。在 单缓冲 中,您现在会在屏幕上看到一个半圆,因为渲染过程显示的是未完成的图像。
在双缓冲中,逻辑进程只会写入后台缓冲区,并且只有当它结束绘图过程时才会标记后台缓冲区完成。然后将 后台缓冲区 的内容与 前台缓冲区 交换,渲染过程现在将显示完成的图像,您将看不到任何伪影.
因此,双缓冲 的优势 是用户不会看到任何伪像,也不会体验到诸如闪烁之类的东西。
然而,这是以增加 运行 宁时间(交换操作)为代价的,尤其是增加了 space(整个图像的 2 倍)的成本。
现在,虽然 三重缓冲 的成本更高(3 倍图像 space),但它会加快处理速度。这里有两个后台缓冲区和一个前台缓冲区 .
假设您使用双缓冲并且当前您正在将后台缓冲区交换到前台缓冲区 因为你刚刚完成了绘图操作。这可能需要一些时间,同时您的图形卡(速度非常快 - 比交换缓冲区的软件代码快)可以开始下一个绘图操作,但它不能作为 buffer 被屏蔽了。
有了三重缓冲,显卡现在可以开始绘制到另一个缓冲区作为一个后台缓冲区永远免费,不涉及任何交换机制。
现在我们知道事情是如何工作的,也很清楚为什么你没有看到超过 3 个缓冲区 的缓冲解决方案(至少在常见的应用程序中没有)——它只是有没有受益于一般概念的观点。
例如,在处理 3D 虚拟现实内容(立体图像)时,可以看到增加的缓冲区数量,您可以分别对左声道和右声道使用双缓冲,以 四缓冲 一共
作为最后的旁注 vsync 表示同步 back 和 front buffer 的交换与显示器的轮询率相匹配,以最大程度地减少撕裂效果。
似乎大多数人建议只使用 2 或 3。这是否只是因为超过 3 占用太多处理能力或其他原因(请原谅我对这个有点陌生)?在什么样的程序中你会使用超过 3 个缓冲区?
2 或 3 适合我的程序,我只是好奇。
实际上,一旦了解了缓冲策略的好处,它就很容易理解了。 让我们简单看看这三种情况下会发生什么。
在单缓冲中,您只有一个显示器可以写入图像数据。相反 double buffering 有两个 displays,front 和 back buffer.
通常应用程序的渲染和逻辑进程是分开的并且运行 并行(例如显示器和显卡)。假设渲染进程有一个轮询率,每 15 毫秒在监视器上显示一个图像。想象一下逻辑过程当前正在执行一些图像操作(画一个圆圈)但此刻尚未完成(圆圈只画了一半)。在 单缓冲 中,您现在会在屏幕上看到一个半圆,因为渲染过程显示的是未完成的图像。
在双缓冲中,逻辑进程只会写入后台缓冲区,并且只有当它结束绘图过程时才会标记后台缓冲区完成。然后将 后台缓冲区 的内容与 前台缓冲区 交换,渲染过程现在将显示完成的图像,您将看不到任何伪影.
因此,双缓冲 的优势 是用户不会看到任何伪像,也不会体验到诸如闪烁之类的东西。 然而,这是以增加 运行 宁时间(交换操作)为代价的,尤其是增加了 space(整个图像的 2 倍)的成本。
现在,虽然 三重缓冲 的成本更高(3 倍图像 space),但它会加快处理速度。这里有两个后台缓冲区和一个前台缓冲区 .
假设您使用双缓冲并且当前您正在将后台缓冲区交换到前台缓冲区 因为你刚刚完成了绘图操作。这可能需要一些时间,同时您的图形卡(速度非常快 - 比交换缓冲区的软件代码快)可以开始下一个绘图操作,但它不能作为 buffer 被屏蔽了。
有了三重缓冲,显卡现在可以开始绘制到另一个缓冲区作为一个后台缓冲区永远免费,不涉及任何交换机制。
现在我们知道事情是如何工作的,也很清楚为什么你没有看到超过 3 个缓冲区 的缓冲解决方案(至少在常见的应用程序中没有)——它只是有没有受益于一般概念的观点。
例如,在处理 3D 虚拟现实内容(立体图像)时,可以看到增加的缓冲区数量,您可以分别对左声道和右声道使用双缓冲,以 四缓冲 一共
作为最后的旁注 vsync 表示同步 back 和 front buffer 的交换与显示器的轮询率相匹配,以最大程度地减少撕裂效果。