DoubleBuffering究竟是什么?

时间:2011-04-06 14:07:43

标签: c# winforms

我知道有两种类型的缓冲区:front and back buffer

我知道我应该设置DoubleBuffered属性,以便控件不会闪烁。

但是,我们使用DoubleBuffered属性的其他模块是什么?

4 个答案:

答案 0 :(得分:2)

在屏幕上绘图时,如果你没有双倍缓冲,当你绘制每个控件,图形等时,它将直接绘制到屏幕上。这会导致闪烁,因为每次绘制新对象时它实际上都必须重新绘制整个屏幕并修改视图。

通过启用双缓冲,它会绘制到一个看不见的缓冲区,当完成该缓冲区的绘制时,它会将整个视图一次性地绘制到屏幕上,从而消除闪烁。

它被称为双缓冲,因为在幕后,正在发生的事情是你有2个缓冲区,我们称它们为A和B.在第一遍,你绘制到A然后将视图切换到A缓冲区画在屏幕上。在第二遍,由于A现在是屏幕视图,您绘制到B,然后将视图切换到B缓冲区。冲洗并重复。所以你只是在两个缓冲区之间来回切换......你切换缓冲区,因为否则你实际上需要A,B和一个从A或B复制的屏幕缓冲区。由于内存复制,这两者都很慢并且需要RAM多了50%......糟糕的主意。

希望能更好地解释发生的事情。

答案 1 :(得分:1)

任何时候你想在没有观众看到它之前画一些东西,你需要加倍缓冲。

答案 2 :(得分:1)

创建两个图像缓冲区

对其中一个进行Blit,它将是“Front”并将其显示在屏幕上

现在对于每个帧,Blit到“Back”缓冲区,然后将它与“front”交换,所以它现在是后面并重复。

通过仅向屏幕显示完全合成的图像来停止闪烁。

答案 3 :(得分:1)

如果更改某些图形,则必须重新绘制屏幕以显示图形更改。双缓冲区时,绘制到当前不可见的后缓冲区,然后在图形完全绘制时交换缓冲区。 (将后缓冲区移到前面)否则用户将看到以闪烁形式绘制图像的过程。所以要回答你的问题,你想要加倍缓冲显着改变显示的任何东西。