GDI、GDI+和OpenGL真的已经过时/弃用了吗?

24

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

最后一个类别被描述为

Legacy Graphics: 过时的技术,不应在新应用程序中使用。

这个类别包括(但不限于)以下 API:

  • GDI
  • GDI+
  • OpenGL

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

6个回答

15

我怀疑微软对“遗留”的定义与任何明智的开发者所应该做的事情无关,而是基于Windows API的一些大规模重写。

从Windows Vista开始,微软一直在重新设计许多API。现在我们有MMDevAPI作为唯一真正的音频API,WIC是唯一真正的图像文件API等。从我看到/听到的情况来看,这些新API比旧API要好得多,而所有“遗留”系统都基于新API工作。在Windows Vista及更高版本中,DirectSound完全基于MMDevAPI,需要读取图像文件的组件通过WIC完成。

Windows 8将有一个ARM版本,似乎只支持当前Windows API的子集。在Windows on ARM发布之前,我们不会确定,但根据Visual Studio 11中为ARM平台包含的库(参考:http://www.winehq.org/pipermail/wine-devel/2012-March/094559.html),看起来GDI+和OpenGL将不可用。GDI可供链接,但这并不一定意味着它完整无损。

这个新的API大致对应于Vista及更高版本中VS11 ARM目标中的库。我猜列表中的任何内容都是因为它要么是做某件事的最新和最好的方式,要么它在技术上太重要而不能被丢弃(至少现在是这样)。因此,“遗留”的定义是指不是至少一件事情的最新和最好的方式。
我不确定什么是唯一真正的图形API。我们已经有了Direct2D、Direct3D、DirectComposition(顺便说一下,直到Windows 8才可用)、DirectWrite和DXGI。DXGI似乎最接近,但我对图形API的理解不够深刻。我怀疑gdi32在技术上非常难以摆脱。非遗留应用程序如何找出窗口的一部分何时被显示,并因此必须绘制,而不使用涉及HDC的WM_PAINT呢?库如何代表应用程序完成这项工作,而不是替换其窗口过程?我们如何制作半透明窗口,而不使用需要HDC的UpdateLayeredWindow?user32多少依赖于gdi32,它们真的可以分开吗?
从技术角度来看,Windows可以轻松摆脱GDI+和OpenGL,但我不确定放弃OpenGL是否可行,即使在没有任何向后兼容性承诺的新平台上。它对开发人员来说似乎太有价值了。GDI+并不是很重要,但第三方提供替代方案非常容易。

我会建议使用您列出的任何API,最糟糕的情况可能是,如果要将应用程序移植到metro或Windows on ARM,则必须重新编写UI。如果您的需求简单且将直接为Windows API编码,则GDI是一个不错的选择。几乎没有什么情况下我会推荐GDI+作为绘图API而不是OpenGL。GDI+速度慢、功能有限,而且只能在Windows上使用。GDI+ API更简单,因为它是2D的,所以如果您需要做一些非常简单但需要反锯齿处理的事情,那么也许它是值得的。

3
自从发布Windows on ARM (现在称为Windows RT)以来的更新:在Windows RT设备上浏览system32目录会显示gdiplus、d3d9和directdraw,但opengl不存在。但是无法访问这些库,因为桌面不会运行未经Microsoft签名的任何exe文件。开发Windows RT的唯一途径是通过Metro(现在称为Windows 8 Store),它限制了旧API的使用。 - Esme Povirk

11

OpenGL并未被弃用,微软的实现被弃用了。微软的实现停留在1.1版本,已经过时了。当前标准的版本已经超过了4。如果你想使用OpenGL,在Windows桌面上,NVIDIAAMDIntel显卡都完全支持它,但是不支持在Metro Windows Modern UI应用程序中使用,这是一个行业标准,也可以在Mac和Linux上使用。如果你需要一个软件后备实现,Mesa可以满足你的需求,并且它甚至可以在DOS上工作。 (由于Mesa可以渲染到内存缓冲区,没有理由它不能在Modern UI应用程序中工作,但是你可能不想这样做,因为它可能会很慢。)需要注意的一点是,访问Windows桌面上的OpenGL功能的API WGL依赖于GDI(已经被弃用了),所以如果你想使你的应用程序迎接未来,最好使用类似FreeGLUTSDL的东西,这也会带来平台独立性。

OpenGL ES 是 OpenGL 的一种变体,可在 Android Apple iOS 上运行。 通过 WebGL ,还可以在JavaScript中使用它,Internet Explorer 11会支持该技术(几乎每个其他浏览器已经支持)。 ANGLE为Windows提供了一个 GLES 的硬件加速实现,其中利用了DirectX(版本9或11),因此也应该适用于现代化UI应用程序。 Mesa再次涵盖了软件实现。

简而言之: OpenGL不仅没有被弃用,而且跨平台,标准化,并且在行业中有巨大的动力。相比之下,GDI和GDI +则不然。


1
新的OpenGL在Windows上初始化的API将是什么?如果MS弃用WGL(FreeGLUT和SDL也依赖于WGL),那么初始化过程是否涉及通过COM进行驱动程序特定接口?这样,我们又回到了DOS。 - user877329
EGL是在所有平台上初始化OpenGL ES的标准方式,ANGLE支持它。JavaScript中的WebGL将被IE11支持。在Windows上初始化桌面OpenGL的唯一方法不幸的是WGL,尽管微软不再支持它,但图形供应商仍然支持它。与DOS只有一个API相比,它并不那么糟糕。除非你真的需要几何着色器,否则请使用OpenGL ES 2,这是与桌面OpenGL和DirectX相比最大的缺失之处。WGL本身可能不会消失,直到微软结束桌面支持,此时桌面OpenGL将不再相关。 - Jonathan Baldwin
如今OpenGL已经半过时,它被Vulkan所取代。然而,GPU制造商仍然将供应商特定扩展注册到OpenGL中以获取新功能。 - William

8
如果您想要支持Windows XP,那么您就是在支持一个“传统”的操作系统,因此使用一个“传统”的图形框架是一个合理的选择。
即使这不是真的,我也不同意链接的MSDN文章中给出的建议。这里的“传统”状态更多地与Windows团队认为哪种技术本周很酷有关。 “过时”的状态只意味着负责的组不再接受或满足错误报告(除了关键安全问题)。这没什么大不了的 - 这些技术已经存在了足够长的时间,它们非常完整和稳定。
GDI不会消失,因此,如果您需要一些坚如磐石的东西,保证在任何地方得到支持,那就是我会选择的。
如果您需要比GDI提供的更多的2D功能(例如alpha通道透明度),那么可以考虑使用GDI+。 它的速度几乎比GDI慢一个数量级,但在现代机器上,拥有比您想要的更强大的性能并不是太大的问题。这也将得到长期支持。
话虽如此,如果我今天要编写一个新应用程序,我可能不会费心去使用OpenGL。它几乎没有比Direct2D和DirectWrite更好的优势,这两个技术都是Microsoft推荐作为GDI / GDI +的替代品。如果您必须针对Windows XP,那么使用OpenGL可能会有一些好处,因为据我所知,Direct2D / DirectWrite仅支持Vista及更高版本,但这是因为(正如我最初提到的),Windows XP完全属于“传统”或“过时”的阵营。或者,如果您已经很了解OpenGL,并且没有时间或愿望学习Direct2D / DirectWrite,那么在新应用程序中继续使用它可能是有意义的。
不要让MSDN文章的措辞吓倒您。根据所有可用信息选择最适合您特定用例的技术。等到这些技术彻底消失时,您将不得不出于其他原因完全重新编写应用程序。
编辑:嗯,看起来DirectWrite也被一些人宣布为“过时”,因为已被Direct2D取代。这很有趣,它甚至还没有存在足够长的时间让我费心去学习它。我想这只能支持我早期的观点,“过时”仅仅表示某种技术不再是Microsoft开发人员认为时髦的技术。
我个人正在等待所有的错误得到解决(并且我们决定使用一种半永久性标准)之前,我不会为我的应用程序做出任何转换。我看到的所有DirectDraw或Direct2D编写的内容都有严重的渲染错误,并且是性能噩梦,即使在相当有能力的机器上也是如此。当然,它们只在正确的情况下有时出现,但这对我来说已经太多了。我发誓,模糊的文本总是出现。无法阅读屏幕上的内容对我和我的用户来说是致命问题。GDI没有这个问题,而且它也不会消失。

相信DirectWrite在XP上已经过时,但仍然有效,而Direct2D非常新,并且绝对不支持XP。它们在功能上相似,但在内部API方面有很大的区别。 - user541686
@Mehrdad:你知道吗,我很可能把DirectWrite和DirectDraw搞混了。这些东西对我来说太复杂了...如果你认为我犯了一个巨大的错误,请随意编辑。 - Cody Gray
既然你提到了,也许是我把它们搞混了...让我再仔细检查一下哈哈。:) 另外,关于模糊的问题,可以看看这里:https://dev59.com/_Goy5IYBdhLWcg3wWso_... 它是可以解决的。 - user541686
@Mehrdad:是的,我已经看到了那个。我赞同了这个问题,但没有赞同答案。这不是真正的理想解决方案。当然,DirectSomething对于需要以奇怪的角度旋转的游戏和文本非常好。但我不写那样的应用程序。 - Cody Gray
3
确实,完全同意。(我太傻了,你确实看到了问题...你甚至有第一个评论。>_<)顺便说一下,看起来你是正确的,而我是搞混了:DirectWrite只在Vista SP2以后才有,而DirectDraw是XP上的那个。这甚至在我的问题中...对于混淆我感到抱歉。:\ - user541686

7
GDI,GDI +和OpenGL真的过时/废弃吗?
这并非适用于OpenGL。OpenGL 4允许您在winxp上使用几何着色器。而DirectX(DirectX 10及更高版本不支持WInXP)无法实现此功能。它也是为数不多的跨平台3D API之一。
从商业角度来看,微软有兴趣推广DirectX,因为它是他们的技术,可以将开发人员锁定在Windows平台上(他们还有兴趣使DirectX对开发人员更具吸引力,但这是另一个故事)。因此,他们不热衷于推广OpenGL是有道理的。
还应该使用什么?
建议尽可能停止使用特定于平台的技术。获取跨平台框架并将其用于应用程序。有Qt,GTK,wxWidgets等GUI应用程序工具包,以及SDL(和替代品)用于游戏。这样,当平台开发人员决定做出荒谬的决定(例如不支持WinXP上的DX10)时,您就可以以最小的开发成本移动到其他地方。 Qt也非常强大,目前我没有理由为GUI开发使用其他东西。不过,情况将来可能会改变。
简而言之,在为某个平台开发时,您应该记住,平台开发人员可能有与您的愿望不兼容的目标。发现您的源代码已锁定到单个平台并不是非常愉快的体验。您自己的目标应该是第一优先考虑的,如果操作系统开发人员试图让您使用某种您不喜欢的技术,则不应支持该技术。

2
由于OpenGL是一种标准,所以它应该被视为与C或C++同样过时,因此在不久的将来,整个Windows API(今天已经成为在每台x86机器上编译一次即可运行的API,得益于Wine)将被视为过时,而改用.NET和C#。
我使用GDI进行简单图形处理,当需要加速3D时则使用OpenGL。
另一个方面是,微软内置的OpenGL实现肯定要被视为过时,因为它只是1.1版本或者说已经过时很久了。

-2
关于OpenGL,它在资源和显示方面实际上比DirectX表现更好。微软永远不会推广它,因为它无法拥有OpenGL,更不用说大多数人不做研究,而微软可以声称它已经过时了。事实上,OpenGL是开源标准,并且以比闭源更快的速度发展,因为它不仅仅是一个由开发人员组成的团队。此外,微软与许多公司签订合同,只能使用微软的软件发布,这为微软带来更多的业务,同时减少了使用更先进的OpenGL标准的机会。这是一种有趣的锁定方式,微软创建这些合同,使得许多程序都是用DirectX编写的,以保持微软的业务,而没有任何公司会拒绝它,因为微软占据了80%以上的家庭用户市场。

速度在很大程度上取决于硬件、驱动程序以及您要做什么,而且这将永远是粉丝之间的争论。微软不支持OpenGL也有一个非常好的理由(除了供应商锁定):NVidia、AMD和Intel已经为他们做到了。最后,微软正在通过Internet Explorer 11拥抱WebGL(我承认,从未想过会发生,但它确实发生了:D)。 - Jonathan Baldwin
1
我喜欢OpenGL,但是与Windows上的DirectX相比,由于糟糕或有缺陷的驱动程序,性能有时会较差。 - paulm

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