应用程序如何支持多个图形 API?

How do applications support multiple graphics APIs?

我见过许多主要支持 OpenGL 的图形应用程序。我还注意到其中许多应用程序都有一个 -d3d 标志,这将强制它们使用 DirectX API。

单个图形应用程序如何使用两个不同的 API 却呈现完全相同的结果?他们肯定需要为两个 API 添加代码,这既费时又有点浪费?

OpenGL 与 DirectX 的话题对很多人来说都很敏感,所以让我先说我的意图 是不激怒任何一方 "API wars".

如果您谈论的是像 CAD 这样的通用图形软件,它们往往会支持大量 cross-platform 目标。在这些情况下,他们将 OpenGL 用于 MAC 和 *NIX 以及 Windows 等系统。

虽然开发人员可以在 Windows 上使用 OpenGL,但 Windows 上对 OpenGL 的 'default' 支持非常少——仅 OpenGL v1.x 软件。如果你想使用更多 full-featured 版本的 OpenGL,你需要让用户安装一个 OpenGL ICD。这些 OpenGL ICD 的质量在很大程度上取决于每个硬件供应商是否跟上标准,并且在过去 Windows 的 OpenGL ICD 已经针对特定应用程序的非常特定的调用模式进行了调整(阅读 "Doom" ).如果您的应用程序不匹配这些模式,您有时会遇到奇怪的性能问题或遇到其他错误。

视频硬件行业也有这样一种趋势,即 Windows 在 'consumer-grade' 硬件上的 OpenGL 支持对于一些游戏来说是相当小的努力,而 'workstation-grade' 硬件获取大量专注于编写 high-quality OpenGL ICD 的开发人员资源。在这种情况下,针对工作站(再次阅读 CAD)的软件倾向于同时提供 API 以满足用户对更便宜和更昂贵系统的需求。相反,对于游戏来说,需要 2000 美元以上的视频卡来玩是不现实的,因为使用 DirectX 通常更容易、更强大——除非你碰巧遇到市场上 "must-have" OpenGL 唯一的游戏 'consumer-grade' 司机实际上工作得很好。

使用 DirectX,尤其是 Windows 7+ 上的 DirectX 11,可以很好地 'out of the box' 适用于来自不同供应商的各种设备的大多数系统。一些软件开发人员发现它在不同设备之间的一致性要好得多,并在他们同时提供 OpenGL 和 DirectX 时将其用作默认设置。这就是为什么许多 PC 游戏仅在 Windows 上使用 DirectX。但是,如果他们已经在进行抽象以支持 MAC 的 OpenGL,他们很可能也会将其作为 Windows 用户的一个选项。

对于游戏,抽象在渲染引擎中是典型的。为了获得 AAA 游戏的良好性能并打入对他们重要的所有不同平台,他们通常无论如何都必须实施多个版本的渲染器(Direct3D 11 for Windows Vista+,Direct3D 9 for Windows XP特别是对于新兴市场,用于 Xbox 360 的 Direct3D 9 变体、用于 Xbox One 的 Direct3D 11 变体、用于 MAC 的 OpenGL、用于 PlayStation 3 and/or 4 的特定渲染器,以及用于手机游戏的 OpenGL ES ).这通常是通过一个抽象层来实现的,然后每个平台都有专门的编码人员来编组游戏,以利用对他们来说重要的 hardware-specific 功能。这不是一个廉价的解决方案,但许多大型出版商试图通过在许多不同平台上提供其内容版本来套利项目风险,并认为值得额外成本。

对于独立开发者和小型开发者来说,尝试同时支持 OpenGL 和 DirectX 可能是一个相当大的挑战。对他们来说,专注于使用单个 well-supported API 在该平台上为单个平台制作出色的游戏通常更好。然后,如果他们成功了,他们可以通过执行实现多重渲染 APIs 所需的工作将其移植到更多平台,并创建自定义内容处理以针对每个平台进行定制。也就是说,独立游戏通常不注重图形的差异化,因此使用抽象层的功能和性能 trade-offs 不是什么大问题。但是,在许多不同的设备上测试您的游戏并进行 两次 以涵盖 OpenGL 和 DirectX 的成本很高。