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- ...
随机推荐
- python单列模式
单例模式:就是永远用一个对象的实例 初级版 #初级版 class Foo(object): instance=None def __init__(self): pass @classmethod # ...
- Asp.Net Core通过HttpStatusCode状态处理响应结果
在我的一个Asp.Net Core 2.1 的项目中,我们需要通过获得服务器返回的状态,去实现不用的操作,经过多方资料查询和实践,个人总结一种方法 一.修改控制器 在要返回值的控制器Action中,R ...
- 小程序wx.chooseImage的坑
选择图片后可能重新执行onshow()和onhide(),可以在页面中添加锁变量,选择图片前获取,选择完释放,onshow中利用锁来中断执行
- Vue的计算属性,监视属性代码理解
1.计算属性:在computed属性对象中定义计算属性的方法,在页面中使用{{方法名}}来显示计算的结果 //计算属性 computed:{ // 计算属性值的一个方法,方法的返回值是属性值,初始化显 ...
- php 多维数组 array sort 排序 :array_multisort
1.参考链接: php简单实现多维数组排序的方法 参考二: 这个链接很好,可以直接看这个:PHP array_multisort—对多个数组或多维数组进行排序 2.案例一: //13: 最佳: pub ...
- 马凯军201771010116《面向对象与程序设计Java》第十一周学习总结
一.理论知识部分 第九章 集合 1.数据结构介绍:线性结构:线性表,栈,队列,串,数组,文件.非线性结构:树,图. 散列表:又称为哈希表. 散列表算法的基本思想是:以结点的关键字为自变量,通过一定的 ...
- 开始PYTHON之路
曾经的功献给了球场酒精 曾经的激情也献给了爱情 曾经的智商用来副本求生 曾经的VB6老迈的只剩点0 曾经的SQL2000都不兼容 曾经........ 还有一些理想没有实现 还得继续在这个世界谋生 岁 ...
- Linux中挂载详解以及mount命令用法
转自:https://blog.csdn.net/daydayup654/article/details/78788310 挂载概念 Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录 ...
- 分频器的Verilog实现
一.占空比50%的奇数分频 1.实现思路 实现奇数(N)分频,分别用上升沿计数到(N-1)/2,再计数到N-1:用下降沿计数到(N-1)/2,再计数到N-1,得到两个波形,然后把它们相或即可得到N分频 ...
- React native中使用XMLHttpRequest请求数据
一.代码 import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View } from ' ...