C#双缓存技术解决绘图时闪屏问题

绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示。

刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint事件一次。

窗口刷新一次的过程中,每一个图元的重绘都会 立即显示到窗口,因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。

 

所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。

 

根据以上分析可知,

当图元数目不多时,窗口刷新的位置也不多,窗口闪烁效果并不严重;

当图元数目较多时,绘图窗口进行重绘的图元数量增加,绘图窗口每一次 刷新都会导致较多的图元重新绘制,窗口的较多位置都在刷新,闪烁现象自然就会越来越严重。

特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时 间延迟会更长。

 

双缓存实现的原理:

先在内存中开辟一个与原先画布一样大小的画布,将所有内容绘制到新开辟的画布中;绘制完毕后,将绘制好的Bitmap一次性绘制到原先的画布背景上

由于这个过程中只向画布上绘制了一次,所以闪屏的问题得以缓解

 

   public void Print(Canvas ca, float x, float y)
{
    GraphicsState GraphicsState = ca.Graphics.Save();
    Bitmap bufferimage = new Bitmap(Width, Height);
    Graphics gBmp = Graphics.FromImage(bufferimage);
    OnDraw(gBmp);
    ca.Graphics.DrawImage(bufferimage, x, y, Width, Height);
    ca.Graphics.Restore(GraphicsState);
}

 

posted @ 2013-06-21 16:49  呆瓜瓜  阅读(682)  评论(1)    收藏  举报