基于NET的双缓冲技术论文
通常在图形应用程序开发过程中,经常会遇到图形显示时屏幕不停闪烁的现象。画面要产生动态效果,编程时要在视图中进行贴图,并不断刷新重绘,但是刷新频率过高,就会出现闪屏的现象。又或者是实时数据显示,数据不断更新,数据所在的控件也需要不断地刷新,这样也会出现闪屏的现象。因此,闪屏这个问题严重地影响了用户的体验。
针对这个问题有一些解决办法:刷新特定的矩形区域、页面切换、双缓冲等。但在一般情况下,开发人员会选择双缓冲技术,因为适用范围广泛,不过需要较多的内存。
1 闪屏
闪屏现象出现的可能原因:为了维持窗口的正常显示,每次都需要调用Paint事件进行重绘操作刷新画面。虽然窗口在刷新过程中会使所有图元重绘,不过图元的重绘并不引发Paint事件,因此窗口刷新时只会调用一次Paint事件。在窗口刷新过程中,重绘的图元都会马上显示到窗口,只要有图元的位置,就会有图元的更替刷新,当图元较多数量时,图元更替刷新的时间存在肉眼可辨的时差时,就会导致闪烁现象出现;当图元数量较少时,窗体重图元更替刷新的位置也不多,窗口闪烁现象并不会很严重;随着图元数量的增加,绘图窗口每次刷新引起的图元重绘数量也会增加,窗口刷新的位置分布就更加广泛,闪烁现象就会越来越严重。又或者是因为窗口刷新时间间隔小于图元显示到窗口所耗费的时间,因此在对图元进行鼠标跟踪绘制操作,抑或是对图元进行变形操作,由于调用Paint事件次数大量增加,窗口刷新次数也同时增加,即使窗口刷新时所有图元的更替刷新没有时间差异,也会因为延时关系导致闪烁现象。
2 双缓冲技术
2.1 基本思想
Windows的重绘窗体操作一般分为3个阶段:
第一阶段,背景清除,通过Windows的操作系统级背景刷清除重绘窗体上的无效区域。
第二阶段,背景绘制,通过窗体的受保护方法OnPaint-Background完成窗体背景绘制,当然也可以通过重写该方法进行自定义窗体背景的操作。
第三阶段,图形绘制,通过窗体的受保护方法OnPaint完成图形绘制,然后引发Paint事件。3个阶段的操作全完成后,Windows窗体的绘图才算真正完成。而双缓冲技术就是将窗体重绘过程的3个阶段合为一次操作,从而实现图形闪烁现象的消除。具体实现方法是先在一块内存(后端缓冲区)中完成重绘窗体的3个阶段,然后再将绘制好的图形从内存中拷贝到显存中,如图1所示,由于在屏幕上只执行了一次显示图形的操作,因此用户观察不到窗体重绘的中间画面,从而消除了图形的闪烁。
2.2 实现方法
2.2.1 利用默认双缓冲
利用默认双缓冲的方法有两种,第一种也就是最简单的便是将.NetFramework中的Double Buffered属性设置为true:this.DoubleBuffeed=true;
第二种方法便是通过SetStyle为Windows窗体和Windows控件启用默认的双缓冲。在.Net框架2.0以上版本中设置参数属性如下: Double Buffer和Double Buffer参数设为true;而UserPaint设为true表示控件自行负责;All Painting lnWmPaint设为true表示禁止擦除背景。
2.2.2 自定义双缓冲
.netframework中的类Buffered Graphics Context独立管理和分配图形缓冲区。应用程序域都通过其默认Buffered Graphics Context实例实现应用程序默认双缓冲的管理。一般情况下,应用程序的应用域存在唯一性,因而每个应用程序通常都只有一个默认的'由Buffered Graphics Manager类管理Buffered=Graphics Context实例。管理Buffered Graphics Context实现双缓冲的具体步骤如下:引用Buffered Graphics Context类的实例。通过调用Buffered Graphics Context.Allocate方法创建Buffered Graphics类的实例。通过设置Buffered Graphics.属性将图形绘制到缓冲区。
在缓冲区中完成所有的图形绘制操作后,再将缓冲区的图形内容通过Buffered Graphics.Render方法复制到与该缓冲区关联的绘图图面或者指定的绘图图面。完成呈现图形之后,对Buffered Graphics实例调用Dispose方法完成系统资源的释放。
2.2.3 编程实例
无锡地铁一号线的远程故障传输地面软件也需要消除其中的图形闪烁现象。以无锡地铁一号线的远程故障传输地面软件为例子,讲述怎样使用.NET框架内置双缓冲技术消除图形闪烁。
无锡地铁一号线的远程故障传输地面软件是将ERM模块的故障数据通过无线传输传到地面软件,然后通过地面软件将故障数据显示出来。ERM模块将数据打包发给车载PIS,然后车载PIS发给中间服务器,中间服务器再转发给地面软件。地面软件接收的是实时数据,每隔50ms接收的数据就填充显示一次,界面显示的内容需要不断刷新,刷新次数过于频繁,就会出现闪屏的现象。
为解决这个问题,此软件使用了双缓冲技术中的默认缓冲。数据是在ListView、ListBox两个控件上显示,通过Set-Style为ListView、ListBox启用默认缓冲。
没有使用双缓冲时,在屏幕上直接绘制ListBox与ListView,然后填充数据,就会看见屏幕上的数据不停地闪烁;而双缓冲技术的绘图,先在内存上创建的“虚拟屏幕”上绘图、填充数据,然后将绘好了的图形一次性“拷贝”到屏幕上。
其实也可以使用自定义双缓冲来实现,其效果与默认双缓冲一样。默认双缓冲的使用比较简便,自定义的却繁琐一些,但是更具灵活性,然而默认双缓冲是在每次绘图时建立新缓冲区,使用完便马上释放。当应用中绘图操作密集时,这种频繁地分配、释放内存,将会严重影响程序的性能。
3 结语
消除闪屏的常用编程技术便是双缓冲技术。具体应用中需要根据应用的简单难易程度进行选择采用默认双缓冲还是自定义双缓冲,对于绘图操作较少的简单应用程序,一般采用启动默认双缓冲;而对于那种绘图操作密集的应用程序,例如:动画、游戏等,应该优先选择自定义双缓冲,可以控制双缓冲的中间过程,来提高程序性能。
【基于NET的双缓冲技术论文】相关文章:
.net毕业论文参考文献02-12
.NET实习总结12-26
基于核心素养的英语写作教学策略论文09-29
net economy的英语四级作文06-22
科技ASP.NET面试题06-20
ASP.NET面试试题集锦06-20
必备.net面试题及答案06-19
常见.net面试题及答案06-19
ASP.NET专业面试试题06-16