GDI与GDI+性能比较

摘要:
程序比较GDI和GDI+绘图。经过比较,GDI比GDI+具有一些性能优势。同时,我们比较了TGPGraphics对象的创建和每次绘制时共享一个TGPGrapgraphics对象的情况。这两个对象的性能几乎相同,可以忽略不计。

编写程序对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+性能比较》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android:JNI与NDK(二)交叉编译与动态库,静态库udev简述下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Docker-PS命令解析

查看 docker 容器,必然要用到 docker ps 命令。其基本格式为: docker ps [OPTIONS] 关键在于 OPTIONS(选项): 1 常见用法 1. 最常见的用法 $ docker ps 显示当前正在运行的容器。 在 PORTS 一列,如果暴露的端口是连续的,还会被合并在一起,例如一个容器暴露了3个 TCP 端口:100,101...

打开PS是出现“该内存不能为read”是怎么回事?

打开PS是出现“该内存不能为read”是怎么回事? 答:内存不能为read修复工具可以有效修复计算机运行应用程序时提示:该内存不能为read要终止程序的问题,一般XP系统才会出现这个问题。 指令修复法: 1、开始菜单,运行 ,输入cmd, 回车,在命令提示符下输入: 2、for %1 in (%windir%system32*.o photosho...

Linux:PS命令详解与使用

Linux下PS命令详解  https://www.cnblogs.com/softidea/p/5274988.html Linux:PS命令详解与使用https://www.cnblogs.com/moonbaby/p/10528443.html 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1)ps :是显...

Shell与进程

查看当前运行的进程 名称: ps使用权限: 所有使用者 使用方式: ps [options] [--help] 说明: 显示瞬间行程 (process) 的动态 参数: ps的参数非常多, 在此仅列出几个常用的参数并大略介绍含义 常用参数 -A 显示所有进程(等价于-e)(utility) -a...

跟我一起玩Win32开发(10):绘图(C)

今天我们来欣赏一下用于填充图形的函数,当然我不会逐个去介绍,因为我们参考MSDN直接套参数就可以了。 SetDCBrushColor函数有必要扯一下,它的声明如下: [cpp] view plain copy  COLORREF SetDCBrushColor(     __in  HDC hdc,     __in  COLORREF crCo...

win10 ps 键 截图不好使

很早发现自己的ps键不好使,一直以来就习惯了qq截图,毕竟及时传输也方便,但最近感觉利用qq麻烦了起来(个人),幡然醒悟条条大路通罗马,为啥自己就安于现状,不多找几个方法?够蠢。。。。 1.其实win10这么强大本就自带快捷方式 (1)选择可视区域截图: win+shift+s ctrl+v (2)screen草图(截全屏还带编辑绘制功能==实用): wi...