使用双缓冲技术解决winform窗体控件卡顿(dataGridView加载数据缓慢)

一、背景

在做C/S项目中,做好的窗体出现了页面加载控件缓慢,放大、缩小窗体之后,窗体加载卡顿,以及数据渲染缓慢。

二、可以利用双缓冲技术去解决这个问题。那么什么是双缓冲?

百度介绍:我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscreen的句柄(整型指针)、宽度、高度、指向新建offscreen数据缓冲区的指针,该缓冲区是一个在函数外创建的offscreen的数据缓冲区,大小是offscreen的高度*宽度*每个像素点数据的大小。闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决这些问题。双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。

总而言之:在计算机中,动画被视为一种变化的图像序列,由一帧一帧的动态图像组成,这些图像随着时间的改变而改变,后一帧图像是对前一帧图像所作的修改。

在单缓冲动画中,图形直接绘制在显示缓冲区,如果显示后一帧图像,必须擦除屏幕,所以在制作过程中需要不断擦除屏幕,这也是屏幕闪烁(窗体加载缓慢)的原因。双缓冲动画有两个缓冲区,除了有显示缓冲区外,还有内存缓冲区,在制作过程中首先把图形绘制在内存缓冲区中,然后讲内存缓冲区中的图像一次性拷贝到心事缓存区,显示缓冲区只是作为内存缓冲区的一个映像。

举例:

投影仪和白板。但缓冲动画:在使用白板的时候,如果写满了,需要写下一页,那么我只能把白板上的内容擦除掉,再去写内容。双缓冲动画:投影仪的时候是需要需要换内容,我直需要把投影仪中的内容进行修改即可,避免擦除操作。

三、具体方法(代码展示)

1、 C# winform窗体卡顿的解决办法

哪个窗体需要修改页面卡顿,加入此方法

 protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;

                cp.ExStyle |= 0x02000000;

                return cp;
            }
           
        }

该方法是可以解决页面上所有控件加载慢的方法。

在上面的代码中,有用到CreateParams 类,它是具体解决卡顿、闪屏的问题。查阅资料:窗体和控件的属性CreateParams,通过它你能够很方便的控制窗体或控件诸如边框、最大化、最小化关闭,按钮的隐藏、窗体的模式化,弹窗模式等的一些特性

2、那么针对dataGridView加载数据慢,不流畅的现象也可以用以下方法。根源上也是利用了双缓冲技术。

需要在窗体所对应的构造构造函数中写入以下代码,控制DataGridView加载数据延迟的问题。

this.SetStyle(ControlStyles.OptimizedDoubleBuffer //双缓冲
                | ControlStyles.ResizeRedraw 
               | ControlStyles.AllPaintingInWmPaint, //不擦除背景,减少闪烁
                true);
            this.UpdateStyles();

            //利用反射设置DataGridView的双缓冲
            Type dgvType = this.dgvwCustomerManagement.GetType();
            PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
               BindingFlags.Instance | BindingFlags.NonPublic);
            pi.SetValue(this.dgvwCustomerManagement, true, null);
          

四、总结

双缓冲技术是一种用于图形界面绘制的优化技术,通过使用两个缓冲区来减少图像闪烁和提高绘制效率。以下是对双缓冲技术的总结:

1. 原理:双缓冲技术使用两个缓冲区,一个用于绘制图像,一个用于显示图像。绘制图像在后台缓冲区进行,完成后再将整个图像一次性地绘制到前台缓冲区,从而避免了图像闪烁。

2. 优点:使用双缓冲技术可以提高图形界面的绘制效率和用户体验。由于绘制操作在后台进行,用户可以看到一个完整的图像,而不是逐个元素的绘制过程。这样可以减少图像闪烁,并提高用户对界面的感知。

3. 实现方式:实现双缓冲技术可以使用各种编程语言和图形库。一种常用的方式是使用双缓冲绘图对象,将绘制操作指向后台缓冲区,然后将整个后台缓冲区绘制到前台缓冲区。

4. 应用场景:双缓冲技术适用于需要频繁绘制图形界面的场景,如图形编辑器、游戏界面等。在这些场景中,使用双缓冲可以提高绘制效率和用户体验,减少图像闪烁。

5. 注意事项:在使用双缓冲技术时,需要注意内存消耗和性能开销。由于使用了两个缓冲区,可能会增加内存占用。同时,由于每次绘制都需要将整个后台缓冲区绘制到前台缓冲区,可能会增加绘制的时间和CPU开销。

总之,双缓冲技术是一种用于图形界面绘制的优化技术,通过使用两个缓冲区来减少图像闪烁和提高绘制效率。使用双缓冲技术可以改善用户体验,特别是在需要频繁绘制图形界面的场景中。然而,在使用双缓冲技术时需要注意内存消耗和性能开销。

猜你喜欢

转载自blog.csdn.net/weixin_45309155/article/details/129503221