ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

为什么Madeira的DX11选择DXMT:D3D11直接转Metal全解析

为什么Madeira的DX11选择DXMT:D3D11直接转Metal全解析 为什么Madeira的DX11选择DXMTD3D11直接转Metal全解析【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/MadeiraMadeira是一款能在 iPhone 上运行 Windows PC 游戏的开源项目它让DX11游戏通过DXMT把D3D11调用直接翻译成Metal指令绕过 Windows 图形栈。本文带你从架构层面拆解为什么 Madeira 的 DirectX 11 图形路径选择了 DXMT 这条直转 Metal的路线而不是其他常见方案。一、先搞清楚问题iPhone 的 GPU 只有一条路Windows 游戏渲染画面的标准方式大多数老游戏和新游戏都靠 Direct3D简称 D3D——其中D3D9 / D3D10 / D3D11是三个最主要的版本。而 iPhone 上的苹果芯片A15、M 系列等只认苹果自家的Metal图形 API。这就产生了一个硬性约束平台游戏用的 API系统支持的 APIWindowsD3D9 / D3D10 / D3D11 / D3D12均可iOS游戏代码写死 D3D只有 Metal所以无论选什么方案最终都必须有人把 D3D 的调用翻译成 Metal。区别只在于由谁来翻译、怎么翻译。Madeira 的整体分层是FEX-Emu 负责把 x86-64 游戏代码转成 ARM64Wine 提供 Windows 环境而DXMT 负责把 Direct3D 9/10/11 的绘制调用翻译成 Metal——这一层正是 D3D11 游戏能不能画出来的关键。二、DXMT 是什么D3D11 到 Metal 的直连翻译层DXMT 是一个开源的 D3D→Metal 翻译项目上游代码位于仓库的dxmt/子模块Madeira 使用自己的ios-port分支。它的设计思路是薄翻译层不改写游戏逻辑不重绘场景逐调用映射 D3D 的状态到 Metal 对象保留 D3D11 显式的状态模型设备、上下文、资源、命令队列不额外塞入一个大引擎着色器在运行时动态翻译无需预先准备任何编译产物。这种直连设计的好处是D3D11 本身就是一个比较现代的显式 API和 Metal 的抽象层级非常接近翻译层可以做得很薄开销小、兼容面大。两侧分工PE 侧 DLL 与 iOS 侧静态库DXMT 在 Madeira 中被拆成两半分别运行在两个世界PE 侧Windows 世界编译成 ARM64EC 的 Windows DLL被 Wine 加载。产物包括 d3d11.dll、dxgi.dll、winemetal.dll、d3d10core.dll统一放在 app/Madeira/aarch64-windows/。游戏以为自己在调用真正的 D3D11实际拿到的是 DXMT 的 DLL。iOS 侧Metal 世界DXMT 的 unix/Metal 实现winemetal_unix.c等被编译成静态库最终合并进约 79MB 的 libdxmt_combined.a直接链进 Madeira.app。两侧之间通过一张调用表WINE_UNIX_CALL通信PE 侧的一个 D3D 调用查表跳转落到 iOS 侧真正操作 Metal 的代码。整个构建流程记录在 build/dxmt-ios/README.md核心脚本是 build/dxmt-ios/build.sh。三、为什么不用别的方案三条被排除的路路1转 OpenGL / Vulkan —— 在 iOS 上不存在很多翻译层如 ANGLE、Vulkan 转译的目标是 OpenGL ES 或 Vulkan。但苹果早已从 iOS 中移除了 OpenGL ESiOS 上也没有官方 Vulkan。这条路物理上走不通必须直转 Metal。路2像 D3D12 那样完整重写一个引擎重写引擎如 Dawn 之于 D3D12意味着实现一个完整的 GPU 抽象、资源管理和同步系统工作量以年计。而 D3D11 游戏存量巨大Madeira 需要的是尽快、低成本地覆盖最多游戏——薄翻译层是最务实的选择。这一点在 madeira-d3d12/README.md 里也得到呼应D3D12 才是那个从零实现完整 ABI的重工程而 D3D11 走 DXMT 的轻量路线。路3预编译着色器打包 —— 游戏库无穷无尽如果把游戏着色器提前编译成 Metal 库打包进 App就面临两个死结游戏数量无穷、且每个着色器都是二进制专有格式。DXMT 的方案是让着色器在运行时翻译彻底绕开预编译详见下节。四、DXMT 的关键设计airconv 运行时着色器翻译图形翻译层最难的环节是着色器。DXMT 内置了一个叫airconv的着色器翻译器其工作方式游戏的 DXBC 着色器二进制被 DXBCParser 解析通过 LLVM 15 编译管线DXMT 静态链接了对应的 LLVM 库见 docs/LICENSING.md转译直接产出 Metal 着色器并建立渲染管线。这意味着 D3D9 到 D3D11 覆盖的着色器模型SM3~SM5都在 iPhone 上现场编译首帧稍慢一次之后走 dxmt_shader_cache 缓存。这也是为什么构建脚本要交叉编译一整套 LLVM——DXMT 把编译器也带进了手机。⚙️ 一个小知识DXMT 还带有一个 30 FPS 上限开关配合 docs/madeira.cfg.example 中的dxmt ab;cd配置语法可以为特定游戏调参。五、DXMT 在 Madeira 里如何落地DXMT 的集成涉及几条值得了解的路径构建入口PE 侧用 meson llvm-mingw 交叉编译出 DLLunix 侧由 build/dxmt-ios/build.sh 产出静态库。完整复现步骤见 docs/BUILDING.md 第 4 节32 位游戏支持WoW64 场景下DXMT 的 i386d3d11模拟模块和原生 D3D9 前端dxmt_madeira_native也被编译进 App让 32 位 D3D 游戏获得更好的性能详见 docs/WOW64.md为 D3D12 铺路自研的 D3D12 运行时madeira-d3d12直接复用 DXMT 的 winemetal 桥来驱动 Metal继承了成熟的本地/远程双后端见 madeira-d3d12/README.md 的 M3a 部分。如果需要从源码构建可以克隆仓库https://gitcode.com/GitHub_Trending/mad/Madeira带子模块再按 docs/BUILDING.md 操作。六、一句话总结问题答案为什么必须是 MetaliOS 上不存在 OpenGL ES / VulkanMetal 是唯一出口为什么选 DXMT 而不是重写引擎D3D11 与 Metal 抽象层级接近薄翻译层成本低、覆盖广着色器怎么办内置 airconv LLVM运行时直译无需预编译和自研 D3D12 什么关系分工明确DXMT 管 D3D9/10/11D3D12 由 madeira-d3d12 接手且复用 DXMT 的 Metal 桥 对玩家来说结论很简单只要游戏用的是 D3D9/10/11也就是绝大多数非 D3D12 的 Windows 游戏它们在 Madeira 里画出的每一帧都是 DXMT 在 iPhone 上把 D3D 调用直接翻译成 Metal 的结果。这就是直转 Metal的完整逻辑。【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表