编写程序对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+性能比较的更多相关文章

  1. GDI与GDI+ 贴图性能对比

    在做绘图相关工作,由于对显示绘制结果实时性有要求,筛选了GDI , 与GDI+ 贴图性能. 这里假设在内存中已绘制完成一张图片,现需求显示在控件上,同时,总是更新全部区域. GDI+ 实现 priva ...

  2. Win32中GDI+应用(五)--GDI与GDI+编程模型的区别

    在GDI里面,你要想开始自己的绘图工作,必须先获取一个device context handle,然后把这个handle作为绘图复方法的一个参数,才能完成任务.同时,device context ha ...

  3. GDI+ 填充背景时,非常多时候不起作用,GDI、GDI+配合运用

    在ONDRAW中运行GDI+ 填充背景时,不起作用,不知道什么原因 [cpp] view plaincopy Graphics graphics(pDC->GetSafeHdc()); Bitm ...

  4. GDI+ 和GDI

    GDI:Graphics Device Interface,即图形设备接口,是Windows API的一个重要组成部分.它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具 ...

  5. VC++中GDI和GDI+ 的坐标系统介绍

    在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统.Windows提供了几种映射方式,每一种映射都对应着一种坐标系.例如,绘制图形时,必须给出图形各个点在客户区的位置,其位置用x 和y两 ...

  6. gdi和gdi+比较

    http://www.360doc.com/content/10/1013/17/1066008_60709410.shtmlhttp://www.360doc.com/content/10/1013 ...

  7. (原创)[C#] GDI+ 之鼠标交互:原理、示例、一步步深入、性能优化

    一.前言 "GDI+"与"鼠标交互",乍一听好像不可能,也无从下手,但是实现原理比想象中要简单很多. 基于"GDI+"的"交互&q ...

  8. GDI+编程说明及小结

    原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...

  9. Win32 GDI 非矩形区域剪裁,双缓冲技术

    传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X- ...

随机推荐

  1. python单列模式

    单例模式:就是永远用一个对象的实例 初级版 #初级版 class Foo(object): instance=None def __init__(self): pass @classmethod # ...

  2. Asp.Net Core通过HttpStatusCode状态处理响应结果

    在我的一个Asp.Net Core 2.1 的项目中,我们需要通过获得服务器返回的状态,去实现不用的操作,经过多方资料查询和实践,个人总结一种方法 一.修改控制器 在要返回值的控制器Action中,R ...

  3. 小程序wx.chooseImage的坑

    选择图片后可能重新执行onshow()和onhide(),可以在页面中添加锁变量,选择图片前获取,选择完释放,onshow中利用锁来中断执行

  4. Vue的计算属性,监视属性代码理解

    1.计算属性:在computed属性对象中定义计算属性的方法,在页面中使用{{方法名}}来显示计算的结果 //计算属性 computed:{ // 计算属性值的一个方法,方法的返回值是属性值,初始化显 ...

  5. php 多维数组 array sort 排序 :array_multisort

    1.参考链接: php简单实现多维数组排序的方法 参考二: 这个链接很好,可以直接看这个:PHP array_multisort—对多个数组或多维数组进行排序 2.案例一: //13: 最佳: pub ...

  6. 马凯军201771010116《面向对象与程序设计Java》第十一周学习总结

    一.理论知识部分 第九章  集合 1.数据结构介绍:线性结构:线性表,栈,队列,串,数组,文件.非线性结构:树,图. 散列表:又称为哈希表. 散列表算法的基本思想是:以结点的关键字为自变量,通过一定的 ...

  7. 开始PYTHON之路

    曾经的功献给了球场酒精 曾经的激情也献给了爱情 曾经的智商用来副本求生 曾经的VB6老迈的只剩点0 曾经的SQL2000都不兼容 曾经........ 还有一些理想没有实现 还得继续在这个世界谋生 岁 ...

  8. Linux中挂载详解以及mount命令用法

    转自:https://blog.csdn.net/daydayup654/article/details/78788310 挂载概念 Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录 ...

  9. 分频器的Verilog实现

    一.占空比50%的奇数分频 1.实现思路 实现奇数(N)分频,分别用上升沿计数到(N-1)/2,再计数到N-1:用下降沿计数到(N-1)/2,再计数到N-1,得到两个波形,然后把它们相或即可得到N分频 ...

  10. React native中使用XMLHttpRequest请求数据

    一.代码 import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View } from ' ...