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

Mil*_*son 2 java bufferstrategy bufferedstrategy

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

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

Zab*_*uza 6

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


单缓冲中,您只有一个显示器可以将图像数据写入.相反双缓冲具有两个显示 s时,后缓冲器.

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

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

双缓冲的例证

因此,双缓冲优点是用户不会看到任何人工制品,也不会遇到闪烁等物品.然而,这是以增加运行时间(交换操作)为代价的,尤其是增加的空间成本(整个图像的2倍).


现在,当tripple缓冲成本更高(3倍图像空间)时,它将加速这个过程.这里有两个 后缓冲区一个 前缓冲区.

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

通过三重缓冲,图形卡现在可以开始绘制到另一个缓冲区,因为一个后备缓冲区始终是空闲的,并且不涉及任何交换机制.


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

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

最后一点注意vsync意味着将后置前置缓冲区的交换与监视器的轮询速率同步,以最大限度地减少撕裂效应.

  • 所有这一切也意味着只要你有一个区域作为输出(所以没有3D),拥有3个以上的缓冲区几乎没有任何意义. (2认同)