GDI,GDI +和OpenGL是否已经过时/弃用?

时间:2012-04-04 08:49:25

标签: winapi opengl graphics gdi+ gdi

如果您打开页面"Graphics and Gaming (Windows)" on microsoft.com

最后一个类别被描述为

  

旧版图形:过时的技术,不应在新版本中使用   应用

此类别包括(以及其他)以下API:

  • GDI
  • GDI +
  • 的OpenGL

你有什么看法?如果我想今天推出一款新软件,它必须支持Windows XP(仍然约占所有已安装系统的50%)。 Direct2D需要Windows 7 / Vista。还应该使用什么?

6 个答案:

答案 0 :(得分:14)

我怀疑微软对“遗产”的定义与任何明智的开发人员应该做的事情没有什么关系,而是基于Windows API的一些Grand Rewrite。

从Windows Vista开始,微软一直在重新设计他们的许多API。我们现在有MMDevAPI作为One True Sound API,WIC是One True Image File API等。从我所看到/听到的,这些新的API比旧的更好,而且“遗留”系统都可以工作基于新的。在Windows Vista及更高版本中,DirectSound完全基于MMDevAPI,需要读取图像文件的组件通过WIC进行。

Windows 8将具有ARM版本,它看起来只支持当前Windows API的一部分。在ARM上发布Windows之前我们不会确定,但是,基于Visual Studio 11中ARM平台所包含的库(参考:http://www.winehq.org/pipermail/wine-devel/2012-March/094559.html),它看起来像GDI +和OpenGL将无法使用。 GDI可用于链接,但这并不一定意味着它完好无损。

这个来自Vista及以后的新API大致对应于VS11 ARM目标中的库。我猜这个列表上的任何内容都存在,因为它是执行它所做的最新和最好的方式,或者丢弃(现在)技术上太重要了。因此,“遗产”是任何不是至少做一件事的最新和最好的方式。

我不确定One True Graphics API是什么。我们已经有Direct2D,Direct3D,DirectComposition(顺便说一句,直到Windows 8才能使用),DirectWrite和DXGI。 DXGI似乎最接近,但我对图形API的理解还不够深入。我怀疑gdi32在技术上很难摆脱。非遗留应用程序如何在发现窗口的一部分时发现并因此必须绘制,而不使用涉及HDC的WM_PAINT,以及库如何代表应用程序执行此操作而不替换其窗口过程?我们如何在不使用UpdateLayeredWindow制作半透明窗口的情况下使用HDC? user32依赖于gdi32多少钱,它们真的可以分开吗?

从技术角度来看,Windows可以轻松摆脱GDI +和OpenGL,但我不相信摆脱OpenGL会解决问题,即使在一个不承诺任何向后兼容性的新平台上也是如此。对开发人员来说似乎太有价值了GDI +并不是那么重要,但第三方提供替代品非常容易。

我会说使用你列出的任何API,而最糟糕的情况是,如果你想将你的应用程序移植到ARM上的Metro或Windows,你必须重写你的UI。如果您的需求很简单并且您将直接为Windows API编码,那么GDI是一个很好的选择。在我推荐GDI +而不是OpenGL作为绘图API的情况并不多。 GDI +速度慢,有限,仅适用于Windows。 GDI + API更简单,因为它是2D,所以如果你需要做一些非常简单但有抗锯齿的东西,也许这是值得的。

答案 1 :(得分:8)

不推荐使用OpenGL, Microsoft的实现。微软的实现停留在版本1.1, 旧版本。该标准的当前版本已超过版本4.如果您要使用OpenGL,Windows桌面上的NVidiaATIIntel图形卡完全支持它,但不是在 Metro Windows现代UI应用程序is an industry standard,中,也适用于Mac和Linux。如果你需要一个软件回退实现,Mesa已经覆盖了你,它even works on DOS.(因为Mesa可以渲染到内存缓冲区,没有理由它不能在Modern UI应用程序中工作,但你可能我不想这样做,因为它可能很慢。)有一点值得注意的是,WGL(用于访问Windows桌面上的OpenGL功能的API)依赖于GDI( 已弃用),所以你可能想要使用类似FreeGLUTSDL的内容,如果您希望面向未来的应用程序,这也会影响您的平台独立性。

OpenGL ES是适用于AndroidApple iOS.的OpenGL的变体。它也可以通过WebGLwhich Internet Explorer 11 will support and pretty much every other browser already does.在JavaScript中访问} ANGLE提供了一个硬件加速的GLES for Windows实现,它支持DirectX(版本9或11),因此也适用于Modern UI应用程序。 Once again, Mesa's got the software implementation covered.

TL; DR:OpenGL不仅已弃用,它是跨平台,标准的,并且在行业中具有巨大的发展势头。 GDI和GDI +,不是那么多。

答案 2 :(得分:7)

如果您想支持Windows XP,那么您就支持“传统”操作系统,因此,使用“传统”图形框架是合乎逻辑的选择。

即使不是是真的,我们只是说我不同意链接的MSDN文章给出的建议。这里的“遗产”状态更多地与Windows团队本周认为酷的技术有关。 “过时”的状态标识仅表示负责组不再接受或完成错误报告(关键安全问题除外)。没有太大的交易 - 这些技术已经存在足够长的时间,它们相当完整且稳定。

GDI不会去任何地方,所以如果你需要一些可以保证在任何地方和任何地方得到支持的坚如磐石的东西,那就是我的目标。

如果您需要比GDI提供的更多2D功能(例如,Alpha通道透明度),那么您可以考虑使用GDI +。它比GDI慢了近一个数量级,但对于功率比你想要的更多的现代机器而言,这并不是一个大问题。这也将在很长一段时间内得到支持。

那就是说,如果我今天正在编写一个新的应用程序,我可能不会打扰OpenGL。它提供的优势远远超过Direct2D和DirectWrite,这些都是微软推动的GDI / GDI +的替代品。如果您绝对必须定位Windows XP,那么使用OpenGL可能会有一些好处,因为据我所知,Direct2D / DirectWrite仅在Vista及更高版本上受支持,但那是因为(正如我之前提到的那样) ,Windows XP完全属于“遗留”或“过时”阵营本身。或者,如果你已经很好地了解OpenGL并且没有时间或者想学习Direct2D / DirectWrite,那么在新的应用程序中继续使用它可能是有意义的。

不要让MSDN文章的措辞吓到你。根据所有可用信息,选择适合您特定用例的任何技术。当这些技术完全消失时,你必须完全重写这个应用程序,原因还有其他十几个原因。

编辑:嗯,看起来DirectWrite也已被声明(至少有些人)“已过时”,已被Direct2D取代。这很有趣,它甚至没有足够长的时间让我费心去学习它。我想这只是为了支持我之前的论点,即“过时”只是指出特定的技术并不是微软开发人员当前认为的流行技术。

在我为任何应用程序进行切换之前,我个人都在等待所有错误得到解决(我们决定采用半永久性标准)。我在DirectDraw或Direct2D中看到的所有东西都有严重的渲染错误,即使在合理的机器上也是一场性能噩梦。当然,在合适的条件下,他们只会出现有时,但这对我来说太过分了。我发誓,模糊的文字一直显示 。无法阅读屏幕上的内容对我和我的用户来说是一个交易杀手。 GDI没有这个问题,而且它不会去任何地方。

答案 3 :(得分:7)

  

GDI,GDI +和OpenGL是否已经过时/弃用?

OpenGL不是这样。 OpenGL 4允许您在winxp上使用几何着色器。 DirectX是不可能的(WInXP不支持DirectX 10及以上版本)。它也是唯一的跨平台3D API之一。

从商业角度来看,MS有兴趣推广DirectX,因为他们的技术将开发人员锁定在Windows平台上(他们也有兴趣让DirectX对开发人员更具吸引力,但这是另一个故事)。因此,他们不热衷于推广OpenGL是有道理的。

  

还应该使用什么?

我建议尽可能停止使用特定于平台的技术。获取跨平台框架并将其用于您的应用程序。有用于GUI应用程序的Qt,GTK,wxWidgets和其他工具包,以及用于游戏的SDL(和备选方案)。这样,当平台开发人员决定做出一个荒谬的决定(比如不支持WinXP上的DX10)时,你就不能以最低的开发成本移动到其他地方。 Qt也非常强大,目前我没有理由使用其他东西进行GUI开发。不过,情况可能会在未来发生变化。

简而言之,在为某个平台开发时,您应该记住,平台开发人员的目标可能与您的意愿不符。发现您的资源已被锁定在单一平台中并不是非常愉快的体验。你自己的目标应该是第一要务,如果os开发人员试图让你使用某些你不喜欢的技术,那么你就不应该支持这种技术。

答案 4 :(得分:2)

因为OpenGL是一个标准,所以它应该被认为同样被弃用为C或C ++所以在整个Windows API之前是一个时间问题 - 今天它已成为每次运行x86机器API的编译,这要感谢Wine - - 被认为已弃用,支持.NET和C#。

当我需要加速3d时,我将GDI用于简单图形和OpenGL。

另一个方面是,微软的OpenGL内置实现绝对被认为是弃用的,因为它只是版本1.1或其他东西,但这已经很长时间了。

答案 5 :(得分:-2)

是的,关于OpenGL,它实际上在很多方面都优于DirectX资源和显示方式。它永远不会被微软推广,因为它不能拥有OpenGL,更不用说大多数人不做他们的研究而微软可以声称它已经老了。事实上,opengl是开源标准,其发展速度远远超过封闭式,因为开发人员需要支付超过1个工作空间。此外,微软与许多公司签订了仅使用微软软件发布的合同,这为微软带来了更多业务,而更少使用更先进的OpenGL标准。这是一个有趣的锁定,如果你愿意,微软创建这些合同,以便许多程序都是用DirectX编写的,以保持微软的业务,没有公司会拒绝它,因为微软拥有大约80%以上的家庭用户市场。