博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GDI与GDI+ 贴图性能对比
阅读量:5241 次
发布时间:2019-06-14

本文共 2528 字,大约阅读时间需要 8 分钟。

 

在做绘图相关工作,由于对显示绘制结果实时性有要求,筛选了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

你可能感兴趣的文章
无锁编程笔记
查看>>
jquery mobile
查看>>
如何在vue单页应用中使用百度地图
查看>>
Springboot使用步骤
查看>>
Spring属性注入
查看>>
Springboot-配置文件
查看>>
Springboot-日志框架
查看>>
P1192-台阶问题
查看>>
一、使用pip安装Python包
查看>>
spring与quartz整合
查看>>
Kattis之旅——Eight Queens
查看>>
3.PHP 教程_PHP 语法
查看>>
Duilib扩展《01》— 双击、右键消息扩展
查看>>
利用Fiddler拦截接口请求并篡改数据
查看>>
python习题:unittest参数化-数据从文件或excel中读取
查看>>
Android控件之GridView探究
查看>>
在工程中要加入新的错误弹出方法
查看>>
PS 滤镜— — sparkle 效果
查看>>
snmpwalk命令常用方法总结
查看>>
网站产品设计
查看>>