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);
}

 

转载于:https://www.cnblogs.com/daiguagua/p/3148661.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值