当 GDI+ 出现时,我记得所有关于它是如何在 Windows 中显示内容的“新、更快、更好”的方式的喧嚣。但每次我看它时,在我看来它实际上只是 GDI 的一个 COM 包装器。
真的吗?还是 GDI+ 真的是一个独立的图形库,只是与 GDI 共享一些范例?
就个人而言,我不确定它如何独立,但我从未以某种方式看到明确的声明。
GDI+ 建立在 GDI 之上,并添加了更多功能。例如,GDI+ 增加了对透明度、抗锯齿位图拉伸等的支持……
GDI+主要是Object based API,GDI是function api。与 GDI 相比,GDI+ 中的大多数功能都没有经过硬件优化(由软件处理)。例如,在 GDI 中,BitBlt 直接由硬件处理。GDI+ 位图绘制功能没有。
GDI+ 是一个强大的 API,但要注意它的性能。
GDI+ 可用于 C++、COM 和 .NET
GDI+ 不是 COM。GDI+ 具有可从 C(或任何其他语言)调用的底层“平面”API,以及仅调用平面 API 的 C++ 中的面向对象包装器。.NET (System.Drawing) 和 Delphi 中也有包装器,它们也只是调用平面 API。它的工作方式与 GDI 完全不同,因为您不将对象(钢笔、画笔、字体)设置为设备上下文,而是将它们传递给绘图函数。它与 GDI 没有太多共同之处。我不知道 GDI+ 的实现是否使用 GDI - 但它可能不会,因为它有很多 GDI 中不可用的特性。
不幸的是,它比 GDI 慢。虽然它非常强大。
正如 decasteljau 同时指出的那样,性能问题可能来自于它不是在硬件中渲染的事实,这与 OpenVG 或 WPF 不同。我最近将 XNA 用于图形实时应用程序。
许多 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)