zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    请教提高上百万行数据insert速度的“经典”方法
    poj1411
    poj1422
    poj1661
    poj1664
    poj1405
    交往艺术与沟通技巧[推荐]
    不可不听的10个职场故事
    也谈如何“领导”你的领导
    十个让爱情稳固的经典好习惯
  • 原文地址:https://www.cnblogs.com/a_bu/p/5587529.html
Copyright © 2011-2022 走看看