• 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:UserszhoupengPicturesBackgroundDefault.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:UserszhoupengPicturesBackgroundDefault.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://files.cnblogs.com/files/a_bu/BitBltTest.rar

  • 相关阅读:
    LeetCode 368Largest Divisible Subset
    macbook 源码安装 redis6.2.6
    macbook 源码安装 nginx1.20.1
    MySQL总结
    DataWork之 MaxComputer的使用
    Spring的IOC源码分析
    Spring Bean的生命周期
    SpringMVC工作原理
    Spring全家桶(二)之SpringMVC总结
    (已经成功部署)配置vue+nginx+uwsgi luffy项目
  • 原文地址:https://www.cnblogs.com/a_bu/p/5587529.html
Copyright © 2020-2023  润新知