在java中使用createBufferStrategy()时,有两个以上的缓冲区是否有帮助?有缺点吗?

时间:2017-07-16 22:08:29

标签: java bufferstrategy bufferedstrategy

似乎大多数人建议只使用2或3.这只是因为超过3个占用了太多的处理能力或某些东西(原谅我,我对此有点新鲜)?在什么样的程序中你会使用3个以上的缓冲区?

2或3对我的程序工作正常,我只是很好奇。

1 个答案:

答案 0 :(得分:6)

实际上,一旦您了解缓冲策略的好处,它就很容易理解。 让我们简单看一下这三种情况会发生什么。

单缓冲中,您只有一个显示来将图像数据写入。相比之下,双缓冲有两个显示后缓冲

通常,应用程序的呈现和逻辑过程被拆分并并行运行(例如监视器和图形卡)。让我们说渲染过程有一个轮询率,在显示器上每隔15ms显示一个图像。想象一下,逻辑过程当前正在执行一些图像处理(绘制一个圆圈),但此刻尚未完成(圆圈仅绘制了一半)。在单缓冲中,您将在屏幕上看到半圈,因为渲染过程会显示未完成的图像。

双缓冲中,逻辑进程只会写入后台缓冲区,并且只有在它结束绘图过程时才会将后台缓冲区标记为已完成。然后使用前缓冲区交换后台缓冲区的内容,渲染过程现在将显示已完成的图像,您将看不到任何瑕疵。

Illustration of double buffering

双缓冲优势是用户不会看到任何人工制品,也不会遇到像闪烁那样的东西。 然而,这需要增加运行时间(交换操作),尤其是增加空间成本(整个图像的2倍)。

现在,当 tripple缓冲付出更多代价(3倍图像空间)时,它将加快整个过程。您有两个 后台缓冲区一个 前台缓冲区

想象一下,您使用双缓冲,当前您正在将后台缓冲区交换到前台缓冲区,因为您刚刚完成绘图操作。这可能需要一些时间,同时您的图形卡(速度非常快 - 比交换缓冲区的软件代码快)可以从下一个绘图操作开始,但不能因为缓冲区被阻止

使用三重缓冲,图形卡现在可以开始绘制到其他缓冲区,因为一个后台缓冲区始终是免费的,不参与任何交换机制。

既然我们知道事情是如何运作的,那么为什么你看不到缓冲区解决方案超过 3个缓冲区(至少在常见的应用程序中不是这样)也很清楚 - 它只是没有从视图中获益一般概念。

在处理3D虚拟现实物品(立体图像)时可以看到增加的缓冲量,例如,您可以使用左缓冲和右声道分别以四缓冲结尾的双缓冲总

最后一点注意 vsync 表示将返回前缓冲区的交换与显示器的轮询率同步,以尽量减少撕裂效应