GDI与GDI+ 贴图性能对比

 

在做绘图相关工作,由于对显示绘制结果实时性有要求,筛选了GDI , 与GDI+ 贴图性能。

这里假设在内存中已绘制完成一张图片,现需求显示在控件上,同时,总是更新全部区域。

GDI+ 实现

    private void PainDraw(Bitmap bitmap) {
            pictureBox1.Invalidate();
            //只调用Invalidate() 并非实时更新, 它会合并多个无效区,且延时显示, Update() 强制更新 
            pictureBox1.Update();
        }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            i++;
            if (i > 500)
            {
                i = 0;
            }
           e.Graphics.DrawImage(bitmap, new Rectangle(i, 0, bitmap.Width, bitmap.Height));
        }

 

调用1000次,测帧速

	private void button2_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();

            path = @"C:\Users\zhoupeng\Pictures\BackgroundDefault.bmp";
            if (bitmap == null)
                bitmap = new Bitmap(path);

            stopWatch.Start();

            for (int i = 0; i < 1000; i++)
            {
                PainDraw(bitmap);
            }

            stopWatch.Stop();

            Console.WriteLine("帧率:{0}", 1000 / (stopWatch.ElapsedMilliseconds / 1000f));

        }

 

结果:
帧率:88.81783
帧率:91.14108
帧率:92.28497
帧率:83.167

 

GDI 实现

int i = 0;
        private void SnapShot(PictureBox c, Bitmap bitmapsrc, IntPtr dc1)
        {
            IntPtr dc2 = GetWindowDC(c.Handle);
            i++;
            if (i > 500) {
                i = 0;
            }

            BitBlt(dc2, i, 0, bitmapsrc.Width, bitmapsrc.Height, dc1, 0, 0, TernaryRasterOperations.SRCCOPY);

            DeleteDC(dc2);
        }


    private void button3_Click(object sender, EventArgs e)
        {

            System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();

            path = @"C:\Users\zhoupeng\Pictures\BackgroundDefault.bmp";
            if (bitmap == null)
                bitmap = new Bitmap(path);

            stopWatch.Start();
            Graphics g = Graphics.FromImage( bitmap);
            IntPtr dc1 = CreateCompatibleDC(g.GetHdc());
            IntPtr dcbitmap;
            IntPtr pOrig = SelectObject(dc1, dcbitmap = bitmap.GetHbitmap());

            for (int i = 0; i < 1000; i++)
            {
                SnapShot(pictureBox1, bitmap, dc1);
            }

            DeleteDC(dc1);
            DeleteObject(dcbitmap);
            g.ReleaseHdc(dc1);
            g.Dispose();
            stopWatch.Stop();

            Console.WriteLine("帧率:{0}", 1000 / (stopWatch.ElapsedMilliseconds / 1000f));
        }

 

 

结果:
帧率:4651.163
帧率:4385.965
帧率:7812.5
帧率:5208.333

 

转载于:https://www.cnblogs.com/a_bu/p/5587529.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值