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;
LBrush: TGPBrush;
LBr: HGDIOBJ;
begin
if m_nCount < 5000 then
begin
//创建缓存
BeginPaint(Handle, ps);
if not Assigned(m_memDC) then
m_memDC := TMemoryDC.Create(ps.hdc);
m_memDC.SetBounds(ps.hdc, Self.ClientRect); //用GDI+绘制
// LBrush := TGPSolidBrush.Create(aclRed);
// LClientRect := MakeRect(Self.ClientRect);
// m_memDC.Graph.FillRectangle(LBrush, LClientRect);
// LBrush.Free; //用GDI绘制
LBr := CreateSolidBrush(clRed);
FillRect(m_memDC.DC, Self.ClientRect, LBr);
DeleteObject(LBr); //缓冲去拷贝
m_memDC.Blt(ps.hdc);
EndPaint(Handle, ps);
Message.Result := 0;
Inc(m_nCount);
end
else
begin
BeginPaint(Handle, ps);
EndPaint(Handle, ps);
Message.Result := 0;
end;
end;
2.用GDI+绘制5K次----耗时约为19s600ms
procedure TForm8.WMPaint(var Message: TWMPaint);
var
ps: PAINTSTRUCT;
LClientRect: TGPRect;
LGraph: TGPGraphics;
LBrush: TGPBrush;
LBr: HGDIOBJ;
begin
if m_nCount < 5000 then
begin
//创建缓存
BeginPaint(Handle, ps);
if not Assigned(m_memDC) then
m_memDC := TMemoryDC.Create(ps.hdc);
m_memDC.SetBounds(ps.hdc, Self.ClientRect); //用GDI+绘制
LGraph := TGPGraphics.Create(m_memDC.DC);
LBrush := TGPSolidBrush.Create(aclRed);
LClientRect := MakeRect(Self.ClientRect);
LGraph.FillRectangle(LBrush, LClientRect);
LGraph.Free;
LBrush.Free; //用GDI绘制
// LBr := CreateSolidBrush(clRed);
// FillRect(m_memDC.DC, Self.ClientRect, LBr);
// DeleteObject(LBr); //缓冲去拷贝
m_memDC.Blt(ps.hdc);
EndPaint(Handle, ps);
Message.Result := 0;
Inc(m_nCount);
end
else
begin
BeginPaint(Handle, ps);
EndPaint(Handle, ps);
Message.Result := 0;
end;
end;
3.用GDI+绘制5K次(不重复创建TGPGraphics)----耗时约为19s500ms
procedure TForm8.WMPaint(var Message: TWMPaint);
var
ps: PAINTSTRUCT;
LClientRect: TGPRect;
LGraph: TGPGraphics;
LBrush: TGPBrush;
LBr: HGDIOBJ;
begin
if m_nCount < 5000 then
begin
//创建缓存
BeginPaint(Handle, ps);
if not Assigned(m_memDC) then
m_memDC := TMemoryDC.Create(ps.hdc);
m_memDC.SetBounds(ps.hdc, Self.ClientRect); //用GDI+绘制
LBrush := TGPSolidBrush.Create(aclRed);
LClientRect := MakeRect(Self.ClientRect);
m_memDC.Graph.FillRectangle(LBrush, LClientRect);
LBrush.Free; //用GDI绘制
// LBr := CreateSolidBrush(clRed);
// FillRect(m_memDC.DC, Self.ClientRect, LBr);
// DeleteObject(LBr); //缓冲去拷贝
m_memDC.Blt(ps.hdc);
EndPaint(Handle, ps);
Message.Result := 0;
Inc(m_nCount);
end
else
begin
BeginPaint(Handle, ps);
EndPaint(Handle, ps);
Message.Result := 0;
end;
end;
GDI与GDI+性能比较的更多相关文章
- GDI与GDI+ 贴图性能对比
在做绘图相关工作,由于对显示绘制结果实时性有要求,筛选了GDI , 与GDI+ 贴图性能. 这里假设在内存中已绘制完成一张图片,现需求显示在控件上,同时,总是更新全部区域. GDI+ 实现 priva ...
- Win32中GDI+应用(五)--GDI与GDI+编程模型的区别
在GDI里面,你要想开始自己的绘图工作,必须先获取一个device context handle,然后把这个handle作为绘图复方法的一个参数,才能完成任务.同时,device context ha ...
- GDI+ 填充背景时,非常多时候不起作用,GDI、GDI+配合运用
在ONDRAW中运行GDI+ 填充背景时,不起作用,不知道什么原因 [cpp] view plaincopy Graphics graphics(pDC->GetSafeHdc()); Bitm ...
- GDI+ 和GDI
GDI:Graphics Device Interface,即图形设备接口,是Windows API的一个重要组成部分.它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具 ...
- VC++中GDI和GDI+ 的坐标系统介绍
在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统.Windows提供了几种映射方式,每一种映射都对应着一种坐标系.例如,绘制图形时,必须给出图形各个点在客户区的位置,其位置用x 和y两 ...
- gdi和gdi+比较
http://www.360doc.com/content/10/1013/17/1066008_60709410.shtmlhttp://www.360doc.com/content/10/1013 ...
- (原创)[C#] GDI+ 之鼠标交互:原理、示例、一步步深入、性能优化
一.前言 "GDI+"与"鼠标交互",乍一听好像不可能,也无从下手,但是实现原理比想象中要简单很多. 基于"GDI+"的"交互&q ...
- GDI+编程说明及小结
原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...
- Win32 GDI 非矩形区域剪裁,双缓冲技术
传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X- ...
随机推荐
- L362 When to Bring up Salary During the Job Interview Process
Money is an awkward topic of conversation for many professionals—even more so when you’re busy tryin ...
- 后台List里的数据传到前台表格和下拉列表为什么不显示
传到前台表格和下拉列表我是用<c:forEach做的,百度了很久,仔仔细细对我的代码没有问题,那么到底是为什么不显示呢?! 找了很久啊,最后发现是我没有引入jstl的标签库!居然是因为这个…… ...
- dom树渲染对性能的影响
这样写会访问两次dom节点树,一次读取innerHTML,一次重写innerHTML. 当然,加载速度也是很惊人的. 用一个变量把a存起来,只读取和重写innerHTML一次. 可以看到加载时间大幅度 ...
- python基础—列表的使用[]
names = ['zhangyang','guyun','xiangpeng','xuliangchen']print(names[0])print(names[1:3])#切片print(name ...
- redis概述(一)
什么是NoSql? 为了解决高并发.高可用.高可扩展,大数据存储等一系列问题而产生的数据库解决方案,就是NoSql. NoSql,叫非关系型数据库,它的全名Not only sql.它不能替代关系型数 ...
- Java线程的创建及启动
1.继承Thread类,重写该类的run()方法. package samTest; import java.util.Scanner; /** * Created by Sam on 2018-01 ...
- Java NIO 入门
本文主要记录 Java 中 NIO 相关的基础知识点,以及基本的使用方式. 一.回顾传统的 I/O 刚接触 Java 中的 I/O 时,使用的传统的 BIO 的 API.由于 BIO 设计的类实在太 ...
- Python学习之路基础篇--10Python基础,函数进阶
1 命名空间 对于Python 来说命名空间一共有三种 1 内置命名空间 —— Python 解释器 就是Python 解释器一启动就可以使用的名字,储存在内置命名空间中.内置的名字在启动解释器的时候 ...
- SQLI DUMB SERIES-21
Cookie Injection- Error Based- complex - string ( 基于错误的复杂的字符型Cookie注入) (1)登录成功后有以下页面: 其中红圈内的字符为admin ...
- ewfwefwefe
qwdefwef fwefwef