GDI+是GDI的一层,还是新的东西?

9
当GDI+出现时,我记得有很多关于它是在Windows中显示东西的“新,更快,更好”的方式的喧闹声。但每次我看它时,它似乎只是一个围绕着GDI的COM包装器。
这是真的吗?还是说GDI+确实是一个独立的图形库,只是与GDI共享一些范例?
就个人而言,我不确定它如何能够独立,但我从未看到过明确的声明。
3个回答

9

GDI+是在GDI基础上构建的,并添加了更多功能。例如,GDI+增加了对透明度、反锯齿位图拉伸等的支持...

GDI+主要是基于对象的API,而GDI是一个函数API。大部分GDI+中的功能都不是硬件优化的(它们由软件处理),与GDI形成对比。例如,在GDI中,BitBlt直接由硬件处理。GDI+位图绘制函数则不是。

GDI+是一个强大的API,但要注意其性能。

GDI+可用于C++、COM和.NET。


8

许多GDI函数由图形硬件加速,一些GDI+例程可能在底层使用GDI。但是大部分的GDI+与GDI无关。

一个重要而且显著的例子是文字渲染。在GDI+中,文字渲染完全是在软件中完成的;抗锯齿、字形像素匹配和其他效果都是在没有视频卡的情况下完成的。

alt text
(来源: microsoft.com)

微软的Chris Jackson在他的博客文章中详细描述了GDI和GDI+文字渲染速度差异的有趣测试结果

我的 GDI 代码路径每秒渲染大约 99,000 个字形,而我的 GDI+ 代码路径每秒只能渲染大约 16,000 个字形。

另一个例子是线条绘制。GDI+ 支持抗锯齿线/多边形和圆形/椭圆形绘制,而 GDI 不支持:

alt text
(来源:microsoft.com)
alt text
(来源:microsoft.com)

alt text
(来源: microsoft.com)


3
直接回答您的问题:GDI+是全新的。这实际上成为一个问题,因为它比GDI慢(即不支持硬件加速),而且文本呈现与GDI不同(导致.NET应用程序的不同部分中的文本可能会看起来不同)。它不是围绕GDI的COM封装,事实上它甚至不是COM。它是平面C API。Microsoft创建了一组C++类来简化调用这些平面函数。.NET中的System.Drawing是一组也调用这些平面函数的类。 - Ian Boyd

8

GDI+不是COM组件。GDI+有一个底层的“平面”API,可从C(或任何其他语言)中调用,还有一个基于对象的C++包装器,仅调用平面API。.NET(System.Drawing)和Delphi中也有调用平面API的包装器。它与GDI完全不同,因为您不会将对象(笔刷、画笔、字体)设置到设备上下文中,而是将它们传递给绘图函数。它与GDI没有太多共同之处。但我不知道GDI+的实现是否使用了GDI,但很可能不是,因为它具有许多在GDI中不可用的功能。

不幸的是,它比GDI慢。但它非常强大。

正如decasteljau所指出的那样,性能问题可能源于它不像OpenVG或WPF一样以硬件方式渲染。最近我因此使用XNA进行图形实时应用程序开发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接