我理解双面缓冲面板基本上意味着所有绘图都是在缓冲区完成,然后将缓冲区直接复制到绘图表面。
我正在绘制一个Bitmap,然后使用<link href={{ URL::asset('css/a.css') }} rel="stylesheet">
将该Bitmap绘制到我的面板,这样我就可以保存Bitmap并可以对其进行更新,而无需重新执行所有绘制操作。
就面板的闪烁而言,这与Double Buffering面板相同吗?
或者,我是否应该进行双重缓冲并重新完成所有绘图,如果这意味着我将获得更低的闪烁?
编辑:
我正在使用Graphics.DrawImage
绘制点,这些点是动态生成的,一旦我完成绘图,我就不会存储点。如果我做双缓冲,我还必须承担存储我绘制的所有点的内存开销。
答案 0 :(得分:1)
双缓冲区应该有点不同。让我们说当你修改缓冲区A时,它应该使用缓冲区B绘制;然后当你开始修改缓冲区B时,它应该从A读取。
因此,我们的想法是不写入正在读取的缓冲区。因此,使用外部缓冲区并将其复制到绘图缓冲区似乎与双缓冲区相同。实际上,可以通过在读取缓冲区时复制外部缓冲区来写入缓冲区。
答案 1 :(得分:1)
最佳解决方案主要取决于您绘制的内容,操作的数量,涉及的像素数以及绘图表面的总大小。
一个常见的例子是绘图程序,其中用户在笔划上堆积笔划,每个笔划由数百个点组成。
一般情况下,建议让系统负责对您绘制的控件进行双缓冲。它会比你希望的更好。
因此,您应该重新绘制Paint
事件,而不是尝试实现自己的缓冲位图绘制,以消除闪烁。
闪烁会消失但是由于大量的绘图操作,这将会很慢并导致滞后。
为避免滞后,您可以结合两种方法中的最佳方法:
绘制图形,直到它们变得太多;它取决于绘图调用(基本上是所涉及的像素数)和系统的速度,无论你是否能够在注意到滞后之前支付几百或几万个绘图调用,比如在N
调用之后。
然后缓存第一个N
绘图调用,方法是绘制一个位图,然后将其设置为Panel's BackgroundImage
。来自N+1
的所有绘图仍将绘制到Paint
事件中面板的表面上。当您到达2*N
时,您创建了另一个版本的缓存图片,请在2*N+1
开始表面绘制,依此类推......