技术原理

为什么同为 ARM64,Switch 游戏仍不能直接在 iPhone 上运行?

共享指令集减少了一道障碍。操作系统行为、GPU 程序、应用打包与游戏特定假设,仍然需要逐项适配。

架构笔记 / 01
同为 ARM64 并不等于直接兼容:游戏代码需要经过静态改写、系统服务适配和图形转换,才能在宿主系统运行。ARM64游戏代码ARM64宿主系统代码 · 系统 · 图形相同指令集,不同的运行环境。
原创机制示意。省略了游戏特定处理,不代表兼容性或性能测试。

ARM64 说明 CPU 理解哪些指令,却没有说明系统提供哪些服务、图形命令如何送到 GPU,或者手机允许装载哪种可执行代码。暗黑2重制版兼容层 D2R Mobile 是一个值得拆解的例子:它公开了针对某个特定游戏版本处理这些层次的实现。

本文依据 v1.0.10,提交 2e7177c08048ebf9335fea102cbd1357eaf92832,核查日期为 2026 年 10 月 14 日。以下是基于源码的解释,没有进行性能测试,也不据此宣称任意 Switch 游戏可用。

1. CPU 能理解指令,不等于运行环境相同

这款游戏的大部分 ARM64 程序可以直接交给 Apple CPU 执行。问题在于指令周围的平台约定:某个寄存器可能有专门用途,某条指令可能在请求目标系统根本不存在的内核服务。

项目的改写架构说明列出了对 x18、线程本地存储寄存器、系统调用及计时器读取的处理。线程相关的值改用宿主管理的存储位置;系统调用跳转到宿主入口,由宿主提供所需行为;计时器读取则获得原程序期待的时间表示。

这些处理发生在执行之前。改写器还包含与游戏构建版本绑定的定点修改,并检查原始字节是否符合预期,不匹配就停止。这项保护也解释了为什么换游戏版本不是小事:同一个地址,在另一个构建中可能已经代表完全不同的内容。

2. 宿主需要补齐程序周围的运行环境

运行中的游戏需要线程、同步、内存、文件、输入、音频和平台服务。改写系统调用,只是把请求送到了一个新的入口;入口之后仍须有人正确处理请求。

D2R Mobile 的宿主负责映射程序模块、解析导入、初始化运行时,并实现这些服务。部分条件合适的 C 库调用可以接到 Apple 的库,另一些则需要专门编写宿主行为。宿主说明介绍了多种接管请求的方法,而不是依靠一条通用转换规则。

这一层还直接关系到玩法限制:项目让联网接口返回不可用。本地执行 CPU 指令,不会凭空得到兼容的账户、匹配或多人游戏服务。游戏能否启动,与它能否满足你想玩的模式,需要分开回答。

3. GPU 还有另一套程序要运行

CPU 指令集无法说明图形是否兼容。这款游戏使用 NVN 图形接口,而 Apple 平台使用 Metal。项目接管 NVN 函数查找,将图形调用记录为命令,再通过 Metal 重放。纹理本身的内存布局与格式,也必须得到正确处理。

着色器是另一项转换工作。图形文档描述了从原始 Maxwell GPU 机器码,经 SPIR-V 转成 Metal Shading Language,再编译成 Metal 库的流程。程序内嵌的四个计算着色器,则有手写的 MSL 实现。无 Xcode 路线会把最后的 Metal 编译放到手机上完成,但前面的转换仍在准备电脑上进行。

有些翻译所需信息不能仅从着色器机器码恢复。项目附带的事实表,最初由一一配对的 PC 着色器反射信息生成。生成工具清楚区分了两种任务:普通构建读取现有表,无须 PC 游戏文件;重新生成或核对该表,则需要额外的 PC 侧输入。另一款游戏未必具备相同的配对条件。

在本次快照中,图形文档统计了 523 个被查询的 NVN 名称:203 个按语义实现、13 个为空实现、307 个接到报告未实现调用的桩函数。这是该代码库的工程覆盖情况。把数字相除并不会得到游戏兼容率:不同函数的重要性不同,别的游戏也可能调用另一组函数。

4. iOS 还必须允许装载产出的代码

Apple 的运行时安全说明介绍了可写可执行内存的限制,以及应用沙箱和权限机制。共享 CPU 指令集不会取消这些平台规则。

D2R Mobile 提前完成 CPU 代码改写,再把它作为签名后的可执行代码打包。主要 iOS 源码构建路线将改写模块嵌入应用,嵌入生成工具与装载器共同实现这一安排。运行时没有用 JIT 持续重编译游戏的 CPU 程序。

这减少了一类运行时要求,却没有消除签名、配置、安装或系统版本要求。手机上的 Metal 着色器编译,也与 JIT 翻译游戏 CPU 指令不同。如果只把两者笼统地称为“在手机上编译”,就容易判断错所需工具与实际限制。

换一款游戏,还要解决什么?

至少需要确认输入版本、找出平台敏感指令、覆盖它使用的系统服务、转换图形与着色器,并移除绑定 D2R 地址或数据的假设。然后还要分别验证启动、真实游玩、输入与存档。

验证工具说明了怎样检查较小、明确的结论。指令等价测试可以支持一次改写,却不能独自证明整款游戏行为正确。部分完整验证所需的参考输入没有公开,SwitchToAny 也尚未独立执行这些测试。

判断一条类似路线时,可以始终问四个问题:CPU 代码能否执行,所需服务能否提供,图形能否正确再现,最终应用能否正确安装?如果你想尝试现有 D2R 路线,接着看前置条件;如果正在理解一段新的演示,先看项目现状与证据边界。

结论有范围,来源有版本。

以下为源码核查与维护者报告,本站没有执行游戏或真机测试。展开查看每条记录的限制与原始来源。

静态源码核查面向特定游戏的原生执行路线已核查架构文档

架构文档描述了对 Switch 可执行模块的离线改写、ARM64 原生执行,以及由宿主提供原程序依赖的系统服务。iOS 路线将改写后的代码嵌入已签名的可执行代码段。同一指令集并不能省去装载、ABI、系统服务和图形适配。

边界:这是一项文档核查,不是运行结果。它不能证明通用 Switch 运行环境已经可用,也不能证明其他游戏的兼容性或性能。

项目版本
v1.0.10
来源修订号
2e7177c08048ebf9335fea102cbd1357eaf92832
核查日
2026-10-14
本站运行观察日
未执行
D2R Mobile · dm/README.md
静态源码核查NVN 调用与着色器分别适配到 Metal已核查图形流水线文档

图形层记录 NVN 调用,再以 Metal 命令重放。文档中的着色器链先通过 Ryujinx 翻译器生成 SPIR-V,再由 SPIRV-Cross 生成 MSL,最后使用 Apple 编译器。523 个已登记 NVN 名称中,文档列出 203 个语义实现、13 个空实现和 307 个报告未实现的桩。

边界:这些数量描述一个源码快照,不是兼容率;部分图形操作仍不支持。无 Xcode 安装包把最后的着色器编译移到首次启动;文档还单独说明了四个以手写 MSL 实现的内嵌计算着色器。

项目版本
v1.0.10
来源修订号
2e7177c08048ebf9335fea102cbd1357eaf92832
核查日
2026-10-14
本站运行观察日
未执行
D2R Mobile · dm/gfx/README.md
维护者报告发布包与手机测试属于不同证据安装包构建与另一个手机构建的冒烟报告

v1.0.10 发布说明称,维护者从干净的公开源码构建了两份壳,并在启用免费账号选项的情况下分别生成了安装包。同一份源码的内测构建据报在手机上完成启动、进入主菜单和进入游戏的冒烟检查。

边界:发布说明明确写明:维护者尚未把本次发布的两份壳本身安装到真机。该冒烟检查没有给出手机具体型号、系统或观察日期,不能据此确认长时间游玩、所有签名路线或这两份确切附件的安装结果。

项目版本
v1.0.10
来源修订号
v1.0.10
核查日
2026-10-14
本站运行观察日
未执行
D2R Mobile · v1.0.10 release notes
静态源码核查公开测试代码不等于完整验收可复现已核查验证所需条件

验证文档区分改写检查、单元测试、重放比较、截图门禁和设备检查。完整验收还需要游戏输入、标准存档和参考运行数据;用于取得参考数据的修改版模拟器录制脚本并未随仓库提供。

边界:仅凭公开仓库无法运行所有依赖这些资料的门禁。测试存在不代表执行通过;即使通过,也只覆盖相应输入和条件。SwitchToAny 未运行这些测试或游戏。

项目版本
v1.0.10
来源修订号
2e7177c08048ebf9335fea102cbd1357eaf92832
核查日
2026-10-14
本站运行观察日
未执行
D2R Mobile · dm/verify/README.md
看清项目现状检查必要条件从准备到首次游玩