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;
时间: 2024-08-26 20:56:27

GDI与GDI+性能比较的相关文章

GDI与GDI+ 贴图性能对比

在做绘图相关工作,由于对显示绘制结果实时性有要求,筛选了GDI , 与GDI+ 贴图性能. 这里假设在内存中已绘制完成一张图片,现需求显示在控件上,同时,总是更新全部区域. GDI+ 实现 private void PainDraw(Bitmap bitmap) { pictureBox1.Invalidate(); //只调用Invalidate() 并非实时更新, 它会合并多个无效区,且延时显示, Update() 强制更新 pictureBox1.Update(); } private v

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

在GDI里面,你要想开始自己的绘图工作,必须先获取一个device context handle,然后把这个handle作为绘图复方法的一个参数,才能完成任务.同时,device context handle是同一定的绘图属性绑定在一起的,诸如画笔.话刷等等,你必须在画线之前创建自己的画笔,然后使用selectObject方法把这个画笔同已经获取的device context handle绑定,才能使用LineTo等方法开始画线.不然,你画出来的线使用的是默认的属性:宽度(1),颜色(黑色).但

GDI+ 和GDI

GDI:Graphics Device Interface,即图形设备接口,是Windows API的一个重要组成部分.它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作.它的桥梁作用体现在: (1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对设备驱动程序的调用. 为实现图形设备无关性,Windows的绘图操作在一个设备描述表上进行.用户拥有自己的"逻辑坐标"系统,它独立于实际的物理设备,

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

在ONDRAW中运行GDI+ 填充背景时,不起作用,不知道什么原因 [cpp] view plaincopy Graphics graphics(pDC->GetSafeHdc()); Bitmap bmp(m_imgRec.Width(),m_imgRec.Height()); //第一步 创建与屏幕等大小的内存位图 Graphics grbmp(&bmp); SolidBrush backBrush(RGB(255,255,255)); grbmp.FillRectangle(&

GDI+与GDI的区别简介

一.GDI GDI是位于应用程序与不同硬件之间的中间层,这种结构让程序员从直接处理不同硬件的工作中解放出来,把硬件间的差异交给了GDI处理.GDI通过将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无障碍地在Windows支持的任何图形输出设备上运行.例如,我们可以在不改变程序的前提下,让能在Epson点式打印机上工作的程序也能在激光打印机上工作.它把windows系统中的图形输出转换成硬件命令然后发送给硬件设备.GDI是以文件的形式存储在系统中,系统需要输出图形时把它载入内存

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

在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统.Windows提供了几种映射方式,每一种映射都对应着一种坐标系.例如,绘制图形时,必须给出图形各个点在客户区的位置,其位置用x 和y两个坐标表示,x 表示横坐标,y表示纵坐标.在所有的GDI绘制函数中,这些坐标使用的是一种“逻辑单位”.当GDI函数将结果输出送到某个物理设备上时,Windows将逻辑坐标转换成设备坐标(如屏幕或打印机的像素点).本文讨论了图形环境中的各个映射模式,包括它们是什么,怎么工作的,以及它们真正的含义. 一

GDI+编程小结

GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息. GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows图形图像程序开发的首选. 一.              GDI+的特点和新增功能 GDI+与GDI一样,都具有设备无关性.应用程序的程序员可利用GDI+这样

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

传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X-window协议.你信或者不信,那些看上去很花哨的控件,其实就是一笔一划画上去的而已.GDI提供了画笔(用于线条).画刷(用于填充).调色板(用于支持256色显示).字体(用于文字).如果简单的图形不足以表达,你可以使用位图和画布(DC,设备上下文)直接将图像绘制到屏幕上去.此外,GDI还支持一些简

GDI GDI+ 的区别

GDI+是GDI的下一个版本,它进行了很好的改进,并且易用性更好.GDI的一个好处就是你不必知道任何关于数据怎样在设备上渲染的细节,GDI+更好的实现了这个优点,也就是说,GDI是一个中低层API,你还可能要知道设备,而GDI+是一个高层的API,你不必知道设备.例如你如果要设置某个控件的前景和背景色,只需设置BackColor和ForeColor属性. 编程模式的变化 “GDI uses a stateful model, whereas GDI+ uses a stateless”——GDI