📌 项目地址:willfaust/Madeira | ⭐ 756 颗星 | 🔧 C | 📜 未标注
它是什么
Madeira 想解决一个问题:让 Windows PC 游戏跑在不越狱的 iPhone 上。756 star,C 语言,GPL-3.0-or-later,作者 willfaust,主要在 iPhone 13 Pro(A15)上开发。
目前能玩的只有 Thumper 和 ULTRAKILL 两款。Marvel Cosmic Invasion 进得了游戏,但出现过一次原因不明的进程终止,操控也不稳定。其他一些游戏能进 gameplay,帧率很低。作者自己说得很清楚:这是研究项目,不是产品。
所以这篇文章的重点不在“好不好用”,在“它怎么做到的”。
三层翻译,一个进程
技术栈分三层:
- FEX-Emu:把 x86-64 指令翻译成 ARM64
- Wine(ARM64EC 版):提供 Windows 兼容层
- DXMT:把 D3D11 调用转成 Metal
这三件套在别的平台都有人拼过。Madeira 真正的下功夫之处在进程模型:整条链路跑在单个 Mach 进程里,wineserver 不是一个独立进程,而是退化成了进程里的一个线程。
为什么必须这样?正常 Wine 架构里 wineserver 是独立进程,负责窗口管理和进程间同步。iOS 的沙盒模型对应用起多进程很不友好,这条路走不通,就只能把 wineserver 改造成线程。据我所知,别的 iOS 方案(UTM、Box64 这类)里没见到同样的做法,这应该是这个仓库最有参考价值的一块。
想构建,先过三道坎
第一道是 JIT。 iOS 只允许在调试器附加时开启 JIT,项目用的是 StikJIT(0-Blu/StikJIT)。这条限制直接决定了它上不了 App Store,只能 sideload。
第二道是签名。 免费 Apple ID 就能签,但描述文件 7 天过期,过期就得重新构建、重装。有个好消息:重装后应用容器还在,Wine prefix 和游戏存档不会丢。
第三道是构建本身。 它分成好几条工具链:unix 侧的 Wine 库、ARM64EC 的 PE 模块、FEX、DXMT,最后是 iOS 应用本体,用 xcodebuild 出。原生部分靠 build/*/build.sh 逐个跑。拉代码一条命令:
git clone --recurse-submodules
注意一个坑:FEX、wine、research/dxmt 这三个 submodule 指向的都是作者的 fork,iOS 适配改动全在 fork 里。换成上游官方仓库的代码,构建必挂。
许可证要单独讲
本体是 GPL-3.0-or-later,衍生品分发必须开源。绕的地方在于它 fork 的几个上游项目,fork 的条款和上游不一致:
| Fork | 条款 |
|---|---|
| wine | 依据 LGPL-2.1 第 3 条重新许可为 GPL-3.0-or-later |
| FEX、dxmt | 上游 MIT 保留,修改部分 GPL-3.0-or-later |
| rpmalloc | 上游 0BSD 保留,修改部分 GPL-3.0-or-later |
作者声明这些改动不溯及既往:fork 在此之前就已公开,已经按宽松许可证拿到手的代码仍然有效。每个 fork 里有各自的 LICENSE-MADEIRA.md 写明具体条款,仓库根目录还有 THIRD-PARTY-NOTICES.md 做逐组件说明。打算做衍生品的话,这两份文件是必读。
还有一个实务问题:微软 VC++ 运行时 DLL 不随项目分发,README 原文到这里截断,但意思明确,这部分要自己解决。
我的判断
普通玩家别碰。能玩的游戏就两款,每周要重签,构建门槛也高。
但如果你做兼容层、模拟器或者 iOS 底层方向,这个仓库值得读源码。在 iOS 单进程限制下让 FEX + Wine + DXMT 整条链路活起来,尤其是 wineserver 线程化这一手,目前公开的实现里很少见。756 star 配这个完成度,说明大家看的是技术路径,不是它现在能玩什么。