为什么Linux没有DirectX API?

24

考虑到现代视频卡在Windows系统上使用DirectX API的驱动实现,我想知道为什么这种实现在非Windows系统上没有提供,尤其是在Linux系统上。

考虑到这种功能的明显缺失,我只能假设存在我无法理解的充分理由。但是,在我较为基本的认识中,我只将DirectX调用视为硬件设备上的函数入口点。并且声明一下,我不是指兼容性层(尤其是WINE,这是一个每天都让我感到惊奇的项目),而是直接进行硬件调用的库。

是否可能创建一个开源版本的DirectX?这可能是可行的,但会非常困难吗?


没有“缺少此功能”。Linux提供其他非微软专有的图形API。 - Ben Voigt
18
你完全没有理解问题的要点。他不是在问Linux是否具有加速的3D图形渲染功能,而是在问它是否具有DirectX功能,这是它所没有的。 - Eagle-Eye
6
DirectX 是专有技术。 - neverMind9
1
因为DirectX是由微软授权的专有软件。为什么微软会在非Windows操作系统上提供此软件,并在此过程中给潜在客户提供不使用其操作系统的理由?将来可能会出现这样的原因,但我真诚地怀疑这一点。 - KeyC0de
可能会有所改变:https://devblogs.microsoft.com/directx/directx-heart-linux/ - munish
https://www.world-today-news.com/directx-12-microsoft-will-bring-its-graphics-technology-to-linux/ - munish
7个回答

20

据我所知,DirectX包含三个部分

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

在Linux上没有驱动程序提供DX定义的低级API,因此即使可能提供了DirectX库,如果没有适当的供应商驱动程序,它也将无法工作,而且我看不到有任何供应商会为其硬件平台创建这样的驱动程序。


8
为什么不直接使用OpenGL?它支持DirectX所有功能。你有使用DirectX的特定原因吗?至于原因,微软制作了DirectX,我想他们没有看到任何让其在Linux上运行的必要性。
你可以使用Wine在Linux上运行DirectX游戏。你可以使用MonoGame在Linux上编写XNA。但是所有这些都使用OpenGL来提供硬件加速渲染。据我所知,OpenGL已经(并且可能会)成为Linux未来可预见的唯一选择。
编写自己的DirectX实现是否可行?当然可以-但它涉及编写驱动程序、专有知识以及可能对任何人来说成本太高而无法真正从中受益。
编辑:现在,DXVK是在Linux上运行DirectX应用程序的一种非常实用和高效的方式。

15
这个问题是从可用性的角度提出的,而不是开发方面。如果游戏行业正在使用DirectX,那么我想知道游戏行业在将现有游戏移植到Linux上有哪些障碍。使用完全相同的硬件,我可以在一个操作系统中本地运行游戏,但不能在另一个操作系统中运行,因此在我的天真想象中,我认为只需要编写API层,然后将所有内容传递给驱动程序。显然,这并不存在,所以我的理解是错误的,我只是想得到一些澄清。 - Brian

3
DirectX是一套API集合,包括:
  • Direct3D(绘制3D图形)
  • DirectX Graphics Infrastructure(枚举适配器和监视器以及管理交换链)
  • Direct2D(绘制2D图形)
  • DirectWrite(字体)
  • DirectCompute(GPU计算)
  • DirectSound3D(播放3D声音)
  • DirectX Media(用于2D / 3D Web动画的DirectAnimation,用于多媒体播放和流媒体的DirectShow,用于Web互动性的DirectX Transform,以及用于更高级别的3D图形的Direct3D Retained Mode)
  • DirectX Diagnostics(诊断与DirectX相关的组件并生成报告的工具,如音频、视频和输入驱动程序)
  • DirectX Media Objects(支持流对象,例如编码器、解码器和效果)
  • DirectSetup(安装DirectX组件,并检测当前的DirectX版本)

已停用但仍受支持的DirectX组件包括:

  • DirectDraw
  • DirectInput
  • DirectPlay
  • DirectSound
  • DirectMusic

可以看出,DirectX API套件的许多部分需要重新编写功能以适应Linux驱动程序。此外,DirectX套件的某些部分可能会调用Windows操作系统,并且该代码必须在不侵犯DirectX或Windows操作系统的版权的情况下为Linux机器重写。

是的,您可以编写一个开源API套件,其功能与DirectX相同,适用于Linux,但是如果对Linux的声音和图形驱动程序/支持没有很好的了解,这将是一项非常艰巨的任务。

但是,如果您的问题更多地是“我能否获取/编写某些东西,以使使用DirectX制作的游戏和程序在Linux上运行?” 简而言之,由于更有可能侵犯版权,所以不能。


3

你的问题在2019年时是错误的。 DXVK 是一个使用Vulkan和Wine实现D3D11和D3D10的实现,

Mesa也有本地的Direct3D 9实现,但据我所知,除了Wine之外没有人使用它。


1
长期以来,WINE中也一直有基于OpenGL的DirectX实现。 - Andrea
dxvk现在也是d3d9的实现。 - Fuseteam

2
创建一个用于DirectX的端口工作会遇到与在WINE中遇到的相同问题。它永远不会像在Windows上那样。基于这个原则,您必须研究OpenGL和相关的多平台库。
此刻,如果您想使用已有的DirectX代码实现某些功能,那么WINE将是您最接近的选择。但我不确定使用Visual Studio或纯文本输入如何能让您更接近流畅的环境。WINE库并不离原生库太远,但始终存在仿真,就我而言,这在一定程度上是可以接受的。
如果我看看我的iMac(2011年)上完全设置下运行的Final Fantasy XIV,我认为依赖于WINE的实现也不算太糟糕。游戏在我的iMac上完美地呈现,就像在Bootcamp(Windows)上一样。
如果您真的想在这方面取得成果,您可以尝试在WINE Devs的论坛或邮件列表上询问,了解如何仅使用其DirectX兼容性的实现,并在您的项目中使用它。在那里,您可能可以调用库而不是通过Windows仿真系统调用请求DirectX。
编辑:我完全同意user956030的答案。

0

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

还有两个其他的软件可以考虑,SDL和OpenGL

OpenGL提供了与DirectX相对应的硬件选择,而SDL与OpenGL配合使用,提供了您从DirectX中期望的软件支持


0

自2020年以来,微软一直在努力将DirectX 12移植到WSL2中,这是在this repository中完成的。在邮件列表中,Steve Pronovost评论说,他们可能会努力将此驱动程序移植到Linux上,以使其本地运行。

但是,为了做到这一点,他们需要在内核的DRM堆栈之上实现驱动程序,如果他们想保持驱动程序类似于Windows并具有相关API,则需要修改DRM堆栈本身。

Mesa库也正在进行一些工作,以支持D3D12,主要目的是优化机器学习算法中广泛使用的服务器端GPU计算。

尽管这很棒,但我们不太可能在Linux上运行Windows游戏时看到任何优势。只有当更多的游戏开始支持比DirectX更快、更好的Vulkan时,开源社区才会占据上风。虽然已经有一些实验表明,在Windows上使用DXVK比DirectX 9甚至11更快,例如here中提到的那个实验,但DXVK往往不太可靠,容易出现错误和崩溃。

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