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:\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

时间: 2024-11-10 11:55:48

GDI与GDI+ 贴图性能对比的相关文章

GDI与GDI+性能比较

编写程序对GDI和GDI+绘制进行了比较,经过比较,GDI相对GDI+还是有一些性能优势的. 同时比较了每次绘制创建TGPGraphics对象和共用一个TGPGraphics对象的情况,两者性能相差不大,几可忽略. 1.用GDI绘制5K次----耗时约为19s200ms procedure TForm8.WMPaint(var Message: TWMPaint); var ps: PAINTSTRUCT; LClientRect: TGPRect; LGraph: TGPGraphics; L

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比 在项目中需要使用http调用接口,实现了两套发送http请求的方法,一个是使用apache的httpclient提供的http链接池来发送http请求,另一个是使用java原生的HttpURLConnection来发送http请求,并对两者性能进行了对比. 使用httpclient中的链接池发送http请求 使用最新的4.5.2版httpclient进行实现.在maven中引入 <

iOS中保证线程安全的几种方式与性能对比

来源:景铭巴巴 链接:http://www.jianshu.com/p/938d68ed832c 一.前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@synchronized.NSLock.dispatch_semaphore.NSCondition.pthread_mutex.OSSpinLock.后来网上查了一下,发现他们的实现机制各不相同,性能也各不一样.不好意思,我们平常使用最多的@synchronized是性能最差的.下面我们先分别介绍每个加锁方式的使用,在使用

2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]

2017年的golang.python.php.c++.c.java.Nodejs性能对比[续] 最近忙,这个话题放了几天,今天来个续集.   上篇传送门: 2017年的golang.python.php.c++.c.java.Nodejs性能对比(golang python php c++ java Nodejs Performance)   好了,上回的某些事有些人有异议,今天也回应下. 1.有人说python性能没那么Low? 这个我用pypy 2.7确认了下,确实没那么差, 如果用num

2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)

2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不得不用神奇的斐波那契算法.可能是比较常用或好玩吧. 好了,talk is cheap, show me your code!  打开Mac,点开Clion开始Coding吧! 1.怎么第一是Go呢,因为我个人最近正在用,感觉很不错 package main import "fmt" fun

SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比

原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比 今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章,自己添加了一些内容,做了简单的总结,这个语句还是第一次见到,学习了.我从简单到复杂地写,希望高手们不要见笑.下面的sql语句设计到三个表,表的内容我用txt文件复制进去,这里不妨使用上一个随笔介绍的建立端到端的package的方法将这些表导入到数据库中,具体的就不说了. 从这里下载文件employ

Tomcat 8(十)HTTP/AJP Connector、Bio/Nio/Apr性能对比

Tomcat 8(七)解读Bootstrap介绍过,Connector初始化/启动的时候,将初始化/启动内部的ProtocolHandler.其实ProtocolHandler只是个接口 ProtocolHandler的UML图(以下这些类在org.apache.coyote包下) 创建Connector对象时,Connector的构造函数内会根据server.xml的Connector标签的配置创建ProtocolHandler(默为Http11NioProtocol) public Conn

强大的CSS3/JS:帧动画的多种实现方式与性能对比

Web动画形式 首先我们来了解一下Web有哪些动画形式 1\. CSS3动画 Transform(变形) Transition(过渡) Animation(动画) 2\. JS动画(操作DOM.修改CSS属性值) 3\. Canvas动画 4\. SVG动画 5\. 以Three.js为首的3D动画 以上各种动画形式都可以制作出一种类型的动画,那就是帧动画,也叫序列帧动画,定格动画,逐帧动画等,这里我们统一用帧动画来表述. 这里推荐一下我的前端学习交流扣qun:767273102 ,里面都是学习

ARM演化变迁性能对比

ARM演化变迁: ARM经典:ARM7,ARM9,ARM11性能依次提升. Cortex: M系列:Cortex-M0,Cortex-M1,Cortex-M2,Cortex-M3,Cortex-M4应用于工控领域(没有操作系统)类比单片机性能比单片机强. R系列:Cortex-R4面向实时应用,可以运行操作系统. A系列:Cortex-A5,Cortex-A8,Cortex-A9主要面向多媒体应用,现代智能手机基本采用Cortex-A系列.M,R,A系列性能也是依此提升. 其性能对比:ARM7与