iPhone 模拟器实测:Madeira 在 iOS 跑 x86-64 Windows 游戏拆解
【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu + Wine + DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira
App Store 里搜不到它,但它能在未越狱的 iPhone 上直接运行 x86-64 的 Windows PC 游戏——《Thumper》在这台iPhone 模拟器里带音效稳定出帧,典型 142 FPS,峰值到过 2286 FPS。项目名叫Madeira,作者自己把它标注为研究项目而非商业产品:能跑通的越来越多,但兼容性与帧率因游戏而异,边角随时在变。
它的底牌是三层技术栈:FEX-Emu把 x86-64 指令转写为 ARM64,Wine ARM64EC提供 Windows 运行环境,DXMT把 D3D11 图形调用换成 Metal。三者在同一个 iOS 进程里协作,游戏文件一行不改。
下面按指令走过的"工序"拆原理,再给构建命令、输入配置和兼容清单。
一条指令到 iPhone 屏幕:FEX、Wine、DXMT 流水线全景
指令工序(FEX-Emu)。游戏可执行文件里的 x86-64 机器码先被FEX-Emu接收,它边运行边把指令块转写成 ARM64 并缓存,后续同一块代码直接执行缓存结果。iPhone 全程只认 ARM64。
运行环境工序(Wine ARM64EC)。没有"Windows"这个壳,游戏根本起不来。这里用的是Wine 11.4的 ARM64EC 构建:数百个 Windows API 落在 DLL 层,游戏调用的每个 Win32 接口都在这层兑现。
图形工序(DXMT)。画面不走 DirectX 硬件路径,而是由DXMT把 D3D9/10/11 调用逐条映射到 Metal,最终交给 A 系列芯片的 GPU 出图。
wineserver 线程化:iOS 禁止 fork() 的绕行方案
iOS 应用无法派生其他程序,所以 Wine 的常驻服务wineserver被改造成一个线程,直接挂进 iOS 主进程。你在游戏里看到的每个"Windows 进程",实为同一个 iOS 进程内的线程。
帧率为什么扛得住:原生跑的那大半
性能关键在于分工:Wine 的各 DLL 以 ARM64 原生速度跑在 A 系列芯片上,只有游戏自身的 x86 代码经过 FEX 模拟。开销被压到最小的一块上,这是帧率可观的核心原因。
iOS 的三条规则:JIT 怎么配、7 天重签怎么办、为何只能侧载
硬件门槛先说清:开发验证机型是 A15 芯片的 iPhone 13 Pro,未越狱;更强的芯片效果更佳。真正卡人的是下面三条系统规则。
规则一:JIT 依赖调试器附加(StikDebug 与 CS_DEBUGGED)
规则:iOS 只在调试器附加状态下允许应用执行机器生成的代码,即 JIT 许可不常开。
代价:首次使用要装StikDebug——它 attach 到应用后授予CS_DEBUGGED标志,JIT 从此可用。
回报:FEX 能即时产出 ARM64 指令而非慢速解释,帧率才有谈的余地。
规则二:免费 Apple ID 可用,但 7 天重签一次
规则:免费账号签出的描述文件 7 天过期。
代价:每周重新签名并重装一次应用。
回报:免费账号即可侧载,不必付费开发者证书;且重装后应用数据容器保留,游戏存档与 Wine 前缀(prefix)都不丢,无需重新导入游戏。
规则三:JIT 与 App Store 互斥
规则:依赖调试器附加的机制不在 App Store 审核框架内,上架无解。
代价:只能走侧载通道(SideStore、AltStore 一类工具)安装。
回报:整套 Windows 运行栈落在普通未越狱 iPhone 上。
从源码到 IPA:备料、五条编译链与出包侧载
备料:仓库外依赖先到位
克隆时必须递归拉取子模块——FEX、wine、research/dxmt是含 iOS 移植工作的 fork,直接克隆上游代码无法构建:
git clone --recurse-submodules https://gitcode.com/GitHub_Trending/mad/Madeira仓库之外还有三份输入(清单见 docs/BUILDING.md 的"Inputs that are not in the repository"):
llvm-mingw-20260421交叉编译工具链,解压到toolchains/;- 为 iOS 构建的 LLVM,这一步最熬人,耗时数小时;
- Microsoft Visual C++ 运行时 DLL——许可证受限不随仓库分发,获取方法见 tools/fetch-vcruntime.md。
编译链:五条工序按顺序执行
# 1. GnuTLS/GMP/Nettle 静态库 build/gnutls-ios/build.sh # 2. FEX 双构建:ARM64 静态库 + ARM64EC 模块(产出并复制 xtajit64.dll) build/fex-ios/build.sh && build/fex-arm64ec/build.sh # 3. Wine unix 侧三库 build/ntdll-unix/build.sh && build/wineserver/build.sh && build/win32u-unix/build.sh # 4. DXMT 图形层 build/dxmt-ios/build.sh # 5. 原生 D3D12 运行时 build/madeira-d3d12/build-pe.sh出包:xcodebuild 构建后压成 IPA 侧载
xcodebuild -project app/Madeira.xcodeproj -scheme Madeira \ -destination 'generic/platform=iOS' -allowProvisioningUpdates build经验值:只有 Debug 配置能稳定跑游戏——Release 构建曾导致 guest 崩溃,务必用 Debug。完成后把Payload/Madeira.app压成 IPA,用侧载工具装上。
输入方案:物理手柄、触屏映射与智能仲裁
- 物理手柄:配对的 MFi/蓝牙手柄经 XInput 直通 Windows 游戏,最多 4 个扩展配置文件,槽位稳定不重排;以 250 Hz(4 ms 间隔)采样,按钮、扳机、带符号摇杆原样送入,不叠加软件死区。
- 触屏虚拟手柄:横屏触摸编辑器自由映射 A/B/X/Y、方向键、LB/RB;LT/RT 为全行程扳机,LS/RS 是模拟摇杆,带径向钳制,摇杆位移相对首次触摸点。
- 智能仲裁:物理与触屏输入可叠加——扳机取两者较大值;物理摇杆偏离标准 XInput 死区时优先于触屏摇杆;松开一根手指不会卡住另一根手指正在按住的键。
提示:在Documents/madeira.cfg中设env.MADEIRA_XINPUT = 0并重启,整套 XInput 生产者即可回滚禁用(完整机制见 docs/CONTROLLERS.md)。
兼容清单:哪些 PC 游戏已在真机跑通
| 游戏 | 实测表现 | 帧率记录 |
|---|---|---|
| Thumper | 可玩,音效正常 | 典型 142 FPS,峰值 2286 FPS |
| ULTRAKILL | 可玩 | — |
| Marvel Cosmic Invasion | 已进游戏画面,操控尚不稳定 | — |
| 其余多数游戏 | 多数能进入游戏画面,帧率偏低 | — |
另有一条"硬骨头"进展:Valve 的 Steam 客户端走 Chromium CEF 渲染,团队已经让登录窗口在 iPhone 上渲染并可交互,但整体仍被归为前沿问题。研究项目按游戏区分的怪癖还在消,以上状态以仓库当前提交为准。
高频疑问速答
每周都得重装一次?免费 Apple ID 的签名 7 天过期。重装只换外壳:应用容器保留,游戏、存档、Wine 前缀原样在位。
为什么 App Store 没有?JIT 需要调试器附加授予许可,这是商店框架之外的机制,只能侧载。
32 位游戏还有救吗?有路:Wine 11 的 WoW64 层通过 thunking 在纯 64 位系统上跑 32 位程序,而 iOS 恰好只有 64 位进程,这条路正好成立。
内存不够会被系统杀掉?会。iOS 的 Jetsam 上限约 4096 MB,重度游戏可能触顶;热节流还会持续降频。这是移动设备模拟 PC 游戏的天然瓶颈。
许可证能不能商用二次分发?项目主体为GPL-3.0-or-later,派生分发须保持开源。各上游组件(Wine、FEX-Emu、DXMT、rpmalloc 等)的许可证明细在 LICENSES/ 与 THIRD-PARTY-NOTICES.md,法律口径以 docs/LICENSING.md 为准。
仓库导览
| 位置 | 它能告诉你什么 |
|---|---|
| app/Madeira/ | iOS 应用主体:SwiftUI 前端、Metal 合成器、Wine 桥接 |
| app/Madeira/MadeiraApp.swift | 应用入口,手柄事件捕获从这里启动 |
| app/Madeira/arm64ec-windows/ | 预编译 Wine PE 模块(ntdll.dll、d3d12.dll 等) |
| docs/BUILDING.md | 可复现构建全流程记录 |
| docs/CONTROLLERS.md | 手柄与触屏 XInput 输入机制全解 |
| tools/fetch-vcruntime.md | Microsoft VC++ 运行时的合规获取指南 |
patches/及各 fork | 针对 Wine 的 iOS 移植补丁集(随 fork 检出获取) |
这是一份仍在快速演进的研究项目:链路已通,细节未齐。想读懂"iOS 模拟 PC 游戏"的完整技术链,它目前是最好的公开样本。
【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu + Wine + DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考