为啥没有适用于 Linux 的 DirectX API?

Posted

技术标签:

【中文标题】为啥没有适用于 Linux 的 DirectX API?【英文标题】:Why is there no DirectX API for Linux?为什么没有适用于 Linux 的 DirectX API? 【发布时间】:2012-06-22 16:33:44 【问题描述】:

考虑到现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现,我想知道为什么此实现在非 Windows 系统上不可用,尤其是 Linux。

由于明显缺少此​​功能,我只能假设有一个很好的理由,但我不知道,但在我的原始理解中,我只是将 DirectX 调用视为硬件设备上的函数入口点。郑重声明,我指的不是兼容层(最值得注意的是 WINE,一个让我每天都为之惊叹的项目),而是一个直接调用硬件的库。

是否可以创建 Directx 的开源版本?会不会有可能但非常困难?

【问题讨论】:

不存在“缺少此功能”。 Linux 提供其他非 Microsoft 非专有的图形 API。 @BenVoigt 您完全错过了问题的重点。他问的不是 Linux 有的加速 3D 图形渲染功能,而是它没有的 DirectX 功能。 DirectX 是 ProPrieTarY™。 因为 DirectX 是 Microsoft 许可的专有软件。为什么微软会在非 Windows 操作系统上提供此功能,并在此过程中为潜在客户提供不使用其操作系统的理由?将来可能会有类似的原因,但我真诚地怀疑它。 devblogs.microsoft.com/directx/directx-heart-linux 可能正在改变 【参考方案1】:

AFAIK,DirectX 包含 3 个部分

供应商驱动程序(提供 DX 定义的低级 API) DirectX 库(使用 DX 定义的低级 API 访问硬件,提供 DirectX API) 软件(使用 DirectX API,例如游戏)

linux上没有提供DX定义的低级API的驱动,所以即使提供DirectX库也是可以的,但是没有合适的厂商驱动就不行,我也看不到有没有供应商将为他们的硬件平台创建一个。

【讨论】:

【参考方案2】:

为什么不直接使用 OpenGL?它支持 DirectX 的所有功能。您有使用 DirectX 的特定理由吗?至于原因,Microsoft made DirectX 我猜他们认为没有必要让它在 Linux 上运行。

您可以运行DirectX games in Linux using Wine。您可以使用MonoGame 在 Linux 上对 XNA 进行编程。但所有这些都使用 OpenGL 来提供硬件加速渲染。 AFAIK,在可预见的未来,OpenGL 一直是(并且可能会是)Linux 上的唯一选择。

是否可以编写自己的 DirectX 实现?当然 - 但它涉及编写驱动程序、专有知识以及任何人都可能真正从中受益的成本太高。

编辑:如今,DXVK 是在 Linux 上运行 DirectX 应用程序的一种非常真实和高效的方式。

【讨论】:

这个问题来自可用性的角度,而不是开发的角度。如果游戏行业使用 DirectX,那么我想知道游戏行业将现有游戏移植到 linux 存在哪些障碍。使用完全相同的硬件,我可以在一个操作系统中本地运行游戏,但不能在另一个操作系统中运行,所以天真的我想想象它就像编写 API 层然后将所有内容传递给驱动程序一样简单。显然这不存在所以我的理解是错误的,我只是想澄清一下。【参考方案3】:

DirectX 是一套 API:

Direct3D(绘制 3D 图形) DirectX 图形基础架构(枚举适配器和监视器以及管理交换链) Direct2D(绘制 2D 图形) DirectWrite(字体) DirectCompute(GPU 计算) DirectSound3D(播放 3D 声音) DirectX Media(用于 2D/3D 网络动画的 DirectAnimation、用于多媒体播放和流媒体的 DirectShow、用于网络交互的 DirectX 转换以及用于更高级别 3D 图形的 Direct3D 保留模式) DirectX 诊断(用于诊断和生成有关 DirectX 相关组件(例如音频、视频和输入驱动程序)的报告的工具) DirectX 媒体对象(支持编码器、解码器和效果等流媒体对象) DirectSetup(安装 DirectX 组件,并检测当前 DirectX 版本)

DirectX 组件已弃用,但仍受支持

DirectDraw 直接输入 直接播放 DirectSound DirectMusic

正如您所见,DirectX API 套件的许多部分都需要使用为 Linux 编写的驱动程序的功能重写。此外,DirectX 诉讼的某些部分可能会调用 Windows 操作系统,并且必须为 Linux 机器重写代码,而不会侵犯 DirectX 或 Windows 操作系统的抄写部分。

是的,您可以编写一个与 DirectX for Linux 做同样事情的开源 API 套件,但是如果没有他们的 Linux 制造商对声音和图形驱动程序/支持的深入了解,那么将是一项非常艰巨的任务做。

但是,如果您的问题更多的是“我可以获取/编写一些东西来运行使用 DirectX 制作的游戏和程序以在 Linux 上运行吗?”顾名思义,总之没有,因为更有可能侵犯版权。

【讨论】:

【参考方案4】:

为 DirectX 创建端口的工作会产生与在 WINE 中遇到的相同的问题。它永远不会与 Windows 相同。根据该原则,您将不得不研究 OpenGL 和相关的多平台库。

此时,如果您想使用已有的 DirectX 代码完成某事,WINE 将是您最接近的媒介。再说一次,我不确定 Visual Studio 或普通打字会以何种方式让您更接近流畅的环境。 WINE 库与原生库相差不远,但始终存在仿真,在我看来,在某种程度上是可以接受的。

如果我看看《最终幻想 XIV》在我的 iMac (2011) 上的完整设置下运行得多么出色,我认为依靠 WINE 的实现并没有那么糟糕。游戏与我的 iMac 上的 Bootcamp (Windows) 完全一样。

如果您真的想在这方面开展工作,您可以尝试在他们的论坛或邮件列表中询问 WINE 开发人员,您如何才能仅使用他们的 DirectX 兼容性实现并在您的项目中使用它。您可以调用库而不是通过 Windows 模拟系统调用请求 DirectX。

编辑:我也完全同意 user956030 的回答。

【讨论】:

【参考方案5】:

你的问题在 2019 年是错误的。DXVK 是使用 Vulkan 和 Wine 为 Linux 实现的 D3D11 和 D3D10 实现

mesa 也有原生 Direct3D 9 实现,但据我所知,除了 wine 没有人使用它

【讨论】:

长期以来,在 OpenGL 之上的 WINE 中也有 DirectX 的实现。 dxvk 现在也是 d3d9 的实现【参考方案6】:

DirectX 是专为 Microsoft 目标设计的专有产品,因此发生这种情况是非常不寻常的

我想到了另外两个软件,SDL 和 OpenGL

OpenGL 提供 DirectX 的硬件替代方案,而 SDL 与 OpenGL 一起提供您期望从 DirectX 获得的软件支持

【讨论】:

以上是关于为啥没有适用于 Linux 的 DirectX API?的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有适用于 python 的 Spring DI(组件生命周期)框架?

使用 DirectX 7 获取后台缓冲区

为啥没有适用于所有浏览器的通用 HTML5 视频编解码器标准?

DirectX 11.1 和 Win32 桌面

为啥 println!仅适用于长度小于 33 的数组?

为啥图形布局(适用于 android)不出现在 Eclipse 中?