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

  • 相关阅读:
    Android获取视频音频的时长的方法
    Android动画效果之Frame Animation(逐帧动画)
    去除自定义Toolbar中左边距
    Android Toolbar样式定制详解
    Android 5.x Theme 与 ToolBar 实战
    Android ToolBar 使用完全解析
    Android开发:最详细的 Toolbar 开发实践总结
    SpannableString 转换局部字体大小,但在EditText测量之前设置内容,测量高度为,字体变小之前的高度
    android在Service中弹出Dialog对话框,即全局性对话框
    Could not find com.android.tools.build:gradle:3.0.0-alpha3
  • 原文地址:https://www.cnblogs.com/a_bu/p/5587529.html
Copyright © 2011-2022 走看看