拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

为什么 iPhone 能跑 Windows 3A 游戏?深度解析 Madeira 的 Metal 特性矩阵:Mesh 着色器、光追与 BC 压缩

为什么 iPhone 能跑 Windows 3A 游戏?深度解析 Madeira 的 Metal 特性矩阵:Mesh 着色器、光追与 BC 压缩

为什么 iPhone 能跑 Windows 3A 游戏?深度解析 Madeira 的 Metal 特性矩阵:Mesh 着色器、光追与 BC 压缩

【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu + Wine + DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira

Madeira 是一个让 iPhone 免越狱直接运行 Windows PC 游戏的开源项目(iOS 端需借助 StikDebug 启用 JIT),它把 Windows 的 Direct3D 调用逐层翻译成 Apple GPU 的 Metal 指令。而翻译能不能"翻对",关键就在它的Metal 特性矩阵:Mesh 着色器(网格着色器)、硬件光追(硬件光线追踪)和 BC 纹理压缩三类能力如何被利用。本文带你快速看懂这三项特性在 Madeira 中分别处于什么状态。

特性矩阵总览:一张表看懂支持程度

特性支持状态实现方式
Mesh 着色器(含几何/曲面细分管线)✅ 已实现DXIL → 转换器 mesh 管线模拟
硬件光追❌ 暂不支持查询接口明确返回"不支持"
BC 压缩纹理(BC1–BC7)✅ 完整支持原生 Metal 格式映射 + 软件解码兜底
运行时 DXIL 着色器编译✅ 已实现苹果官方 Metal Shader Converter

D3D12 运行时源码位于 madeira-d3d12/src/pe/madeira_d3d12.c,其开发进度记录在 madeira-d3d12/README.md。

Mesh 着色器:把曲面细分和几何着色器"翻译"成 Metal mesh 管线

Mesh 着色器是 D3D12 的新式管线阶段。iPhone 的 GPU(如 A15、A17 Pro)原生支持 Metal mesh shader,但 Windows 游戏里大量代码是曲面细分(Hull/Domain)和几何着色器(GS)这类"老阶段"。Madeira 的做法是让这些老管线"借用" Metal 的 mesh 管线运行。

从 madeira-d3d12/src/madeira_ir_abi.h 的接口注释可以看到三条实现路径:

  • ml1083 曲面细分:Hull/Domain 着色器对被编译成一条 object/mesh 管线——object 函数负责顶点 + hull(控制点生成),mesh 函数负责 domain(曲面求值),最终产物由 Metal mesh 管线发射。
  • ml927 几何着色器:GS 没有原生对应物,所以整个 GS 管线通过转换器的mesh 模拟(mesh emulation)运行:VS 作为 object 阶段,GS 作为 mesh 阶段。
  • ml1147 DXBC 几何:走 DXBC 后端的 mesh 模拟路径,顶点着色器和几何着色器分别编译为 object/mesh 两个库。

运行时的统计日志(见 madeira-d3d12.c 中的ml1050 residency set日志行)会汇报"多少条曲面细分管线被构建为 mesh 管线、多少 draws 走了 mesh threadgroups 路径",方便排查兼容性。

硬件光追:目前明确"不支持",但留有接口

关于硬件光追,需要给出一个诚实的结论:Madeira 目前没有实现硬件光线追踪。

在 madeira-d3d12/src/pe/madeira_d3d12.c 中有一段关键注释:UE 5.0 这类引擎会专门查询 Feature List4 的 ray tracing 能力位,而 Madeira把所有光追能力位都报告为 off。这是一个刻意的工程决策——告诉引擎"这里没有光追",让游戏自动回退到光栅化渲染,而不是让引擎尝试调用不存在的硬件。

值得注意的是,底层的 metal_irconverter 和 ir_raytracing.h 头文件里已经包含了完整的 ray tracing 管线编译接口(IRCompilerSetRayTracingPipelineConfiguration、hit/miss/any-hit 着色器掩码等),说明编译工具链本身具备光追着色器的转换能力,只是 D3D12 前端尚未接上。对普通用户而言:光追游戏可以玩,但光追效果会被关闭或回退。

BC 压缩纹理:从 BC1 到 BC7 的全格式支持

PC 游戏几乎全部使用 BC(Block Compression)压缩纹理,这是显存占用和带宽的关键。Metal 原生支持 BC 家族像素格式,Madeira 在 madeira-d3d12.c 中把 DXGI 格式完整映射到了 Metal 格式:

DXGI 格式映射到的 Metal 格式
BC1(含 sRGB)WMTPixelFormatBC1_RGBA/_sRGB
BC2、BC3(含 sRGB)WMTPixelFormatBC2_RGBA…BC3_RGBA_sRGB
BC4(RUnorm/RSnorm)、BC5(RG)WMTPixelFormatBC4_RUnorm…BC5_RGSnorm
BC6H(UF16/SF16)、BC7(含 sRGB)WMTPixelFormatBC6H_RGBUfloat…BC7_RGBAUnorm_sRGB

同时还处理了格式块大小:BC1/BC4 为每块 8 字节,其余 BC 格式为 16 字节(4×4 像素块)。

更保险的一层兜底:DXMT(D3D9–11 转 Metal 层)内置了一个纯软件的 BCn 解码器,专门应对"设备不支持 BC 硬件采样"的情况——把压缩块在上传时解码为 RGBA。这个解码器的正确性由 tests/dxmt/bcn-host-test.cpp 在构建机上逐块校验,覆盖 BC1 四色/穿透模式、BC2 显式 alpha、BC3 的 8 值与 6 值插值表、BC4/BC5 标量块,以及奇数尺寸贴图的边界裁剪等容易出错的路径。构建脚本见 tests/dxmt/build-bcn-host-test.sh。

运行时 DXIL 编译:整个矩阵的地基

以上所有特性都建立在同一个地基上:运行时 DXIL → Metal 着色器转换。游戏自带的 DXIL 着色器在创建管线时,由苹果官方 Metal Shader Converter 即时编译为 metallib(转换器头文件见 madeira-d3d12/third_party/metal-shader-converter/)。实测数据(记录于 madeira-d3d12/README.md):

  • M4 Max:首次转换约 1.0 ms,缓存重编译 0.4 ms
  • iPhone(A15):首次 16.8 ms,缓存后 0.6 ms
  • 转换结果带缓存键(GPU 家族 + 部署目标 + 根签名),跨平台结果不共享

测试覆盖从 26/26 的 canary 一路到 90/90 的完整管线验证,均通过 vphone VM 与真机 A15 双重验证。

总结:这套特性矩阵意味着什么?

  • 🎮老游戏(D3D9–11)体验最完整:DXMT + 软件 BC 解码双保险,纹理和几何路径都被逐块验证;
  • ⚙️D3D12 游戏可用性高:Mesh 着色器模拟让曲面细分、几何着色器管线照常工作,纹理全格式直采;
  • 🚫光追暂时缺席:引擎查询会得到"不支持"并走光栅化回退,编译工具链已就绪,属于"接下来会接上"的状态。

想了解更完整的构建与验证流程,可以阅读 docs/BUILDING.md 和 madeira-d3d12/README.md;D3D12 ABI 的接口定义在 madeira-d3d12/src/pe/ 目录下,shader 测试样例(cube、texcube 等)位于 madeira-d3d12/shaders/。

【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu + Wine + DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表