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

  • 相关阅读:
    Blank page instead of the SharePoint Central Administration site
    BizTalk 2010 BAM Configure
    Use ODBA with Visio 2007
    Handling SOAP Exceptions in BizTalk Orchestrations
    BizTalk与WebMethods之间的EDI交换
    Append messages in BizTalk
    FTP protocol commands
    Using Dynamic Maps in BizTalk(From CodeProject)
    Synchronous To Asynchronous Flows Without An Orchestration的简单实现
    WSE3 and "Action for ultimate recipient is required but not present in the message."
  • 原文地址:https://www.cnblogs.com/a_bu/p/5587529.html
Copyright © 2011-2022 走看看