这是真的吗?还是说GDI+确实是一个独立的图形库,只是与GDI共享一些范例?
就个人而言,我不确定它如何能够独立,但我从未看到过明确的声明。
GDI+是在GDI基础上构建的,并添加了更多功能。例如,GDI+增加了对透明度、反锯齿位图拉伸等的支持...
GDI+主要是基于对象的API,而GDI是一个函数API。大部分GDI+中的功能都不是硬件优化的(它们由软件处理),与GDI形成对比。例如,在GDI中,BitBlt直接由硬件处理。GDI+位图绘制函数则不是。
GDI+是一个强大的API,但要注意其性能。
GDI+可用于C++、COM和.NET。
许多GDI函数由图形硬件加速,一些GDI+例程可能在底层使用GDI。但是大部分的GDI+与GDI无关。
一个重要而且显著的例子是文字渲染。在GDI+中,文字渲染完全是在软件中完成的;抗锯齿、字形像素匹配和其他效果都是在没有视频卡的情况下完成的。
(来源: microsoft.com)
微软的Chris Jackson在他的博客文章中详细描述了GDI和GDI+文字渲染速度差异的有趣测试结果:
我的 GDI 代码路径每秒渲染大约 99,000 个字形,而我的 GDI+ 代码路径每秒只能渲染大约 16,000 个字形。
另一个例子是线条绘制。GDI+ 支持抗锯齿线/多边形和圆形/椭圆形绘制,而 GDI 不支持:
(来源:microsoft.com)
(来源:microsoft.com)
(来源: microsoft.com)
GDI+不是COM组件。GDI+有一个底层的“平面”API,可从C(或任何其他语言)中调用,还有一个基于对象的C++包装器,仅调用平面API。.NET(System.Drawing)和Delphi中也有调用平面API的包装器。它与GDI完全不同,因为您不会将对象(笔刷、画笔、字体)设置到设备上下文中,而是将它们传递给绘图函数。它与GDI没有太多共同之处。但我不知道GDI+的实现是否使用了GDI,但很可能不是,因为它具有许多在GDI中不可用的功能。
不幸的是,它比GDI慢。但它非常强大。
正如decasteljau所指出的那样,性能问题可能源于它不像OpenVG或WPF一样以硬件方式渲染。最近我因此使用XNA进行图形实时应用程序开发。
.NET
中的System.Drawing
是一组也调用这些平面函数的类。 - Ian Boyd