C# GDI+使用双缓冲提升效率

发布时间:2018-12-28编辑:佚名阅读(1895)

为了能清楚的对比应用双缓冲技术前后的效果,我编写了一段程序来进行测试。首先,我创建了一个普通的Windows Application,在主Form中,我放置了一个定时器:timer1 ,然后将它的Interval属性设置为10,然后在 Form 上放置两个按纽 ,分别用来控制定时器的开启和关闭。

测试程序

bool flag = false;
LinearGradientBrush brush;
private void timer1_Tick(object sender, EventArgs e)
{
    DateTime t1 = DateTime.Now;
    Graphics g = CreateGraphics();
    if (flag)
    {
        brush = new LinearGradientBrush(new PointF(0.0f, 0.0f),
        new PointF(700.0f, 300.0f), Color.Red, Color.Blue);
        flag = false;
    }
    else
    {
        brush = new LinearGradientBrush(new PointF(0.0f, 0.0f),
        new PointF(700.0f, 300.0f), Color.Blue, Color.Red);
        flag = true;
    }
    for (int j = 0; j < 60; j++)
    {
        for (int i = 0; i < 60; i++)
        {
            g.FillEllipse(brush, i * 10, j * 10, 10, 10);
        }
    }
    DateTime t2 = DateTime.Now;
    TimeSpan sp = t2 - t1;
    float per = 1000 / sp.Milliseconds;
    this.Text = " 速度: " + per.ToString() + " 帧/秒";
}

正如大家所看到的,我在程序中使用循环画了几百个圆形,然后在每次的定时器脉冲事件中使用不同方向的线性渐变来对它们进行填充,形成了一个动画效果。不过不幸的是,程序运行起来闪烁很严重,几乎每次刷新的时候都可以看到一条很明显的扫描线从上慢慢的刷到下来完成整幅图形的刷新动作。如果你不是要模拟老式雷达的区域扫描的话,这种速度不会满足你的要求。

改进代码

bool flag = false;
LinearGradientBrush brush;
private void timer1_Tick(object sender, EventArgs e)
{
    DateTime t1 = DateTime.Now;
    Bitmap bmp = new Bitmap(600, 600);
    Graphics g = Graphics.FromImage(bmp);
    if (flag)
    {
        brush = new LinearGradientBrush(new PointF(0.0f, 0.0f),
        new PointF(700.0f, 300.0f), Color.Red, Color.Blue);
        flag = false;
    }
    else
    {
        brush = new LinearGradientBrush(new PointF(0.0f, 0.0f),
        new PointF(700.0f, 300.0f), Color.Blue, Color.Red);
        flag = true;
    }
    for (int j = 0; j < 60; j++)
    {
        for (int i = 0; i < 60; i++)
        {
            g.FillEllipse(brush, i * 10, j * 10, 10, 10);
        }
    }
    CreateGraphics().DrawImage(bmp, 0, 0);
    DateTime t2 = DateTime.Now;
    TimeSpan sp = t2 - t1;
    float per = 1000 / sp.Milliseconds;
    this.Text = " 速度: " + per.ToString() + " 帧/秒";
}

经过改进后,画面刷新速度大大加快。这究竟是什么原因呢?因为圆是要一个一个画上去,所以每画一个圆,系统就要做一次图形的绘制操作,图形的重绘是很占用资源的,当需要重绘的图形数量很多的时候,所造成的系统开销就特别大,造成我们看到的那种刷新缓慢的情况。那么如何来解决这个问题呢?答案就是双缓冲,何谓 “双缓冲 ”?它的基本原理就是:先在内存中开辟一块虚拟画布,然后将所有需要画的图形先画在这块 “虚拟画布 ”上,最后在一次性将整块画布画到真正的窗体上。因为所有的单个图形的绘制都不是真正的调用显示系统来 “画”,所以不会占用显示系统的开销,极大的提高的绘图效率。

  关键字:C#GDI+双缓冲效率


鼓掌

0

正能量

0

1

呵呵

0


评论区