基于NET的双缓冲技术

作者:黄明文 来源:推广部 时间:2019-03-06 10:48

通常在图形应用程序的开发中,屏幕经常在显示图形时闪烁。屏幕应该产生动态效果。编程时,您应该在视图中进行映射并刷新并重绘重绘。但是,如果刷新率太高,则会出现闪屏。或者实时数据显示,数据不断更新,数据所在的控件需要不断更新,因此会出现闪屏现象。因此,闪屏问题严重影响用户体验。

这个问题有一些解决方案:刷新特定的矩形区域、页面开关、双缓冲区,依此类推。但总的来说,开发人员会选择双缓冲,因为它具有广泛的应用程序但需要更多内存。

1个闪屏

基于NET的双缓冲技术

闪屏现象的可能原因:为了保持窗口的正常显示,每次需要调用Paint事件来重绘操作以刷新屏幕。虽然窗口将在刷新过程中重绘所有基元,但基元的重绘不会引发Paint事件,因此在刷新窗口时仅调用Paint事件。在窗口刷新过程中,重绘的基元将立即显示在窗口中。只要原语有一个位置,就会刷新原语。当存在更多基元时,将刷新基元的刷新时间。当肉眼可以看到时差时,会引起闪烁;当图元数量较少时,表格重元素的位置不会刷新,窗口闪烁现象不严重;随着图元数量的增加,每次刷新图形窗口引起的图元重绘次数也会增加,窗口刷新的位置分布会更加广泛,闪烁现象会越来越严重。或者因为窗口刷新间隔小于基元显示窗口所花费的时间,因此对基元执行鼠标跟踪操作,或者对基元执行转换操作,并且窗口刷新的数量增加到期对Paint事件的大量调用。它也同时增加,即使在刷新窗口时所有元素的替换刷新没有时间差,它也会由于延迟关系而引起闪烁。

2双缓冲技术

2.1基本思路

在第一阶段,背景被清除,重绘表单上的无效区域由Windows操作系统级别背景画笔清除。

第二阶段,背景绘制,通过表单的受保护方法OnPaint-Background来完成表单背景绘制,当然,您也可以通过覆盖方法来自定义表单背景。

在第三阶段,绘制图形,通过窗体的受保护方法OnPaint绘制图形,然后引发Paint事件。完成三个操作阶段后,Windows窗体的绘制才真正完成。双缓冲技术将表格重绘过程的三个阶段组合成一个操作东森游戏平台,从而消除了图形闪烁的现象。具体的实现方法是完成在一块内存(后缓冲区)中重绘表单的三个阶段,然后将绘制的图片从内存复制到视频内存,如图1所示,由于屏幕的原因。仅执行一次显示图形的操作,因此用户无法观察到表格重绘的中间图像,从而消除了图形的闪烁。2.2实施方法

2.2.1使用默认双缓冲

有两种方法可以使用默认的双缓冲。第一个也是最简单的是将.NetFramework中的DoubleBuffered属性设置为true:this.DoubleBuffeed = true;

第二种方法是通过SetStyle为Windows窗体和Windows控件启用默认双缓冲。在.Net Framework 2.0或更高版本中设置参数属性,如下所示:DoubleBuffer和DoubleBuffer参数设置为true; UserPaint设置为true表示控件负责自己; AllPaintinglnWmPaint设置为true以禁用背景的擦除。

2.2.2自定义双缓冲

.netframework中的类BufferedGraphicsContext独立管理和分配图形缓冲区。应用程序域通过其默认的BufferedGraphicsContext实例实现应用程序的默认双缓冲管理。通常,应用程序的应用程序域是唯一的,因此每个应用程序通常只有一个由BufferedGraphicsManager类管理的默认BufferedGraphicsContext实例。管理BufferedGraphicsContext以实现双缓冲的具体步骤如下:参考BufferedGraphicsContext类的实例。通过调用BufferedGraphicsContext.Allocate方法创建BufferedGraphics类的实例。通过设置BufferedGraphics将图形绘制到缓冲区中。属性。

在缓冲区中完成所有图形绘制操作后,缓冲区的图形内容将通过BufferedGraphics.Render方法复制到与缓冲区或指定绘图表面关联的绘图表面。完成图形渲染后,在BufferedGraphics实例上调用Dispose方法以完成系统资源的释放。

基于NET的双缓冲技术

2.2.3编程实例

无锡地铁1号线远程故障传输地面软件也需要消除图形闪烁。以无锡地铁1号线远程故障传输地面软件为例,介绍如何利用.NET框架内置的双缓冲技术消除图形闪烁。

无锡地铁1号线远程故障传输地面软件通过无线传输将ERM模块的故障数据传输到地面软件,然后通过地面软件显示故障数据。 ERM模块将数据打包到车载PIS,然后将车载PIS发送到中间服务器,中间服务器然后将其转发到地面软件。地面软件接收实时数据,每50ms接收的数据被填充并显示一次。界面上显示的内容需要不断刷新。如果刷新次数过于频繁,则会出现闪屏。要解决此问题,此软件在双缓冲中东森平台使用默认缓冲。数据显示在ListView、ListBox的两个控件上,并且通过Set-Style为ListView、ListBox启用默认缓冲区。

当没有使用双缓冲时,直接在屏幕上绘制ListBox和ListView,然后填充数据,你会看到屏幕上的数据一直闪烁;并且双缓冲技术的绘制首先在内存中创建的虚拟屏幕上填充图形、。数据,然后立即将绘制的图形复制到屏幕。

实际上,你也可以使用自定义双缓冲,效果与默认的双缓冲相同。默认的双缓冲更容易使用,但自定义很麻烦,但更灵活。但是,默认的双缓冲是每次绘制时创建一个新的缓冲区,并在您使用它时立即释放它。当应用程序中的绘图操作密集时,这种频繁分配的、会释放内存,这将严重影响程序的性能。

3结论

消除启动屏幕的常见编程技术是双缓冲。在特定应用程序中,必须根据应用程序的易用性选择是使用默认双缓冲还是自定义双缓冲。对于绘图操作较少的简单应用,通常采用默认的双缓冲;对于那些具有密集绘图操作的应用程序例如,动画、游戏等,应该更喜欢自定义双缓冲,可以控制双缓冲的中间过程以提高程序性能。

    上一篇:医学实验教学中医学数理统计的探讨
    下一篇:噪声对上海轨道交通明珠线沿线不同人群影响的调查