应该在我已经从Bitmap绘制的面板上进行双缓冲,以最大限度地减少闪烁?

时间:2017-06-24 15:53:20

标签: c# graphics doublebuffered

我理解双面缓冲面板基本上意味着所有绘图都是在缓冲区完成,然后将缓冲区直接复制到绘图表面。
我正在绘制一个Bitmap,然后使用<link href={{ URL::asset('css/a.css') }} rel="stylesheet"> 将该Bitmap绘制到我的面板,这样我就可以保存Bitmap并可以对其进行更新,而无需重新执行所有绘制操作。
就面板的闪烁而言,这与Double Buffering面板相同吗? 或者,我是否应该进行双重缓冲并重新完成所有绘图,如果这意味着我将获得更低的闪烁?   编辑:   我正在使用Graphics.DrawImage绘制点,这些点是动态生成的,一旦我完成绘图,我就不会存储点。如果我做双缓冲,我还必须承担存储我绘制的所有点的内存开销。

2 个答案:

答案 0 :(得分:1)

双缓冲区应该有点不同。让我们说当你修改缓冲区A时,它应该使用缓冲区B绘制;然后当你开始修改缓冲区B时,它应该从A读取。

因此,我们的想法是不写入正在读取的缓冲区。因此,使用外部缓冲区并将其复制到绘图缓冲区似乎与双缓冲区相同。实际上,可以通过在读取缓冲区时复制外部缓冲区来写入缓冲区。

答案 1 :(得分:1)

最佳解决方案主要取决于您绘制的内容,操作的数量,涉及的像素数以及绘图表面的总大小。

一个常见的例子是绘图程序,其中用户在笔划上堆积笔划,每个笔划由数百个点组成。

一般情况下,建议让系统负责对您绘制的控件进行双缓冲。它会比你希望的更好。

因此,您应该重新绘制Paint事件,而不是尝试实现自己的缓冲位图绘制,以消除闪烁。

闪烁会消失但是由于大量的绘图操作,这将会很慢并导致滞后。

为避免滞后,您可以结合两种方法中的最佳方法:

  • 绘制图形,直到它们变得太多;它取决于绘图调用(基本上是所涉及的像素数)和系统的速度,无论你是否能够在注意到滞后之前支付几百或几万个绘图调用,比如在N调用之后。

  • 然后缓存第一个N绘图调用,方法是绘制一个位图,然后将其设置为Panel's BackgroundImage。来自N+1的所有绘图仍将绘制到Paint事件中面板的表面上。当您到达2*N时,您创建了另一个版本的缓存图片,请在2*N+1开始表面绘制,依此类推......