【问题标题】:How do applications support multiple graphics APIs?应用程序如何支持多个图形 API?
【发布时间】:2015-04-12 13:23:53
【问题描述】:

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

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

【问题讨论】:

  • “计算机科学中的每个问题都可以通过另一个抽象层来解决。”我怀疑这适用于此。
  • 处理渲染 API 的实际代码通常只是整个应用程序的一小部分。拥有不同的渲染后端并不难。通常你有一些部分管理你的图形对象和“场景”(这当然很大程度上取决于应用程序的类型)。以前,游戏甚至有自己的软件光栅化器,后来可选地支持不同的 3D 加速 API。如今,许多游戏和图形应用程序使用常见的 3D 引擎,这些引擎支持不同的渲染 API,主要是为了支持不同的平台。
  • @JonathonReinhart 我想会使用类似包装器的东西,它只调用正确的函数?
  • @JonathonReinhart "计算机科学中的每一个问题都可以通过另一个间接层级来解决" + "除了间接层级太多的问题" ;)
  • @Mhmk 这是正确的。您可以轻松下载任何免费跨平台渲染引擎的源代码并亲自查看。

标签: opengl graphics directx rendering


【解决方案1】:

OpenGL 与 DirectX 的话题对很多人来说都很敏感,所以让我首先说一下我的意图是不要激起“API 战争”的任何一方。

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

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

视频硬件行业也有一种趋势,即“消费级”硬件在 Windows 上的 OpenGL 支持对于一些游戏来说是相当少的工作,而“工作站级”硬件则获得了大量开发人员资源关于编写高质量的 OpenGL ICD。在这种情况下,针对工作站的软件(同样,阅读 CAD)倾向于同时提供这两种 API,以满足用户在更便宜和更昂贵的系统上的需求。相反,对于游戏来说,需要 2000 美元以上的显卡才能玩它是不现实的,使用 DirectX 通常更容易、更强大——除非你碰巧遇到了市场上一款“必备”的 OpenGL 唯一游戏,即“消费者”级别的驱动程序实际上可以很好地配合。

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

对于游戏,抽象在渲染引擎中是典型的。为了获得 AAA 级游戏的良好性能并打入对他们而言重要的所有不同平台,他们通常必须实现其渲染器的多个版本(适用于 Windows Vista+ 的 Direct3D 11,适用于 Windows XP 的 Direct3D 9,尤其是适用于新兴市场的一种变体)用于 Xbox 360 的 Direct3D 9、用于 Xbox One 的 Direct3D 11 的变体、用于 MAC 的 OpenGL、用于 PlayStation 3 和/或 4 的特定渲染器以及用于移动游戏的 OpenGL ES)。这通常是通过一个抽象层来实现的,然后为每个平台提供专门的编码器来编组游戏,以利用对他们来说重要的硬件特定功能。这不是一个便宜的解决方案,但许多大型出版商试图通过在许多不同平台上提供其内容版本来套利项目风险,并认为这值得额外费用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多