PlayStation、Xbox、Windows 等模拟器是如何工作的?
什么是模拟器?它是一种将一种设备“转换”成另一种设备的程序吗?就像把.docx文件转换成.pdf文件一样?如果真那么简单,每款游戏机发售当天我们就能玩到模拟器了,但事实并非如此。我们可能要等上好几年,甚至永远都玩不到。这可以说是编程领域最具挑战性的难题之一。
模拟器并非简单的转换器,而是整个设备的软件版本。处理器、显卡、内存、声卡和操作系统,所有这些组件都必须协调一致、实时运行,并且精度要足够高,以至于游戏或程序根本察觉不到任何差异。
开发从何开始?开发者从哪里获得开发灵感?
模拟器开发者几乎不可能获得游戏机制造商的官方技术文档。索尼、微软或任天堂都不会公开其内部技术规格。相反,他们会将这些信息作为商业机密加以保护。因此,每个项目都始于业内所谓的“逆向工程”。这意味着开发者会拿到真实的硬件,将其拆解,分析电路,截取芯片间的信号,并逐步构建出处理器如何处理固件硬件代码(即直接内置于设备中的软件)中每个指令的图像。
这通常需要采用“洁净室”方法。一组人负责拆解并记录设备的工作原理,而另一组人则利用这些文档,在完全不接触制造商原始代码的情况下,编写一个模拟相同行为的新程序。这种分离不仅仅是技术上的形式,更是一种法律保障,因为模拟本身并不违法,而复制制造商的专有代码则属于违法行为。此外,开发者还需要游戏机的原始BIOS或固件,即控制硬件的基本启动程序。用户通常需要自行获取这些文件,而且往往直接从自己的游戏机上获取,因为根据法律规定,BIOS或固件不能与模拟器一起分发。
开发人员需要了解什么?
如果你读过或即将读到像 PlayStation 3 的 RPCS3 或 Nintendo Switch 的 Eden 这类模拟器的开发者日志,你会很快意识到,这类开发需要的是一个更大的团队,而不仅仅是一个人。你需要掌握各种各样的技能。
这需要对处理器架构有深入的了解,无论是 PowerPC(Xbox 360 处理器)、ARM、MIPS 还是 x86,包括其所有指令、寄存器和时序细节。此外,还需要掌握 GPU 的运行机制,并将其指令转换为 Vulkan 或 DirectX 等现代图形接口。这包括模拟声卡、控制器、内存层次结构以及主机操作系统(用于管理文件、线程和访问权限)。
最大的技术挑战通常是动态重编译,也称为即时 (JIT) 编译。模拟器不会像传统方式那样逐条解释原主机发出的命令(这样做速度太慢),而是实时地将命令翻译成主机处理器的机器代码,并以接近原生速度执行。这要求同时对两种架构都有极其精确的了解,并且最终结果必须与原版完全一致,否则游戏会出现卡顿、崩溃或显示错误画面等问题。

为什么开发过程需要数年甚至数十年?
答案很大程度上就在于一个例子——PlayStation 3。它的Cell处理器由索尼、东芝和IBM联合开发,并非传统的多核处理器,而是一个主处理单元(PPU)与八个特殊的辅助处理单元(SPU)的组合。每个SPU都拥有自己的小型本地内存,无法直接访问主系统内存。游戏程序员必须手动将任务分配给这些单元,因为没有编译器能够自动完成这项工作,这意味着模拟器无法像在传统处理器上那样直接编译代码。
它必须理解这些经过精心优化、极其特殊的代码的真正用途。RPCS3 的开发者们不得不打造一款几乎打破 x86 架构所有关于内存、数据一致性和线程假设的处理器,才能让他们的程序在与 Cell 处理器几乎没有共同特性的硬件上运行。该模拟器的第一个公开原型于 2011 年问世,即使在十多年后的今天,该团队仍然不时宣布一些优化方面的突破,这些突破如今才显著提升了之前无法运行或存在严重问题的游戏部分的速度。
Xbox 360 也面临着类似的挑战,尽管略有不同。Xenia 模拟器的开发始于 2013 年,并相对迅速地推出了首款商业游戏。但到了 2018 年,开发者们却陷入了如何精确模拟 Xenos GPU 的困境。为了显著提升性能,他们花了近三年时间重写了图形代码。如此漫长的开发周期并非出于懒惰或技术不足,而是因为模拟器必须理解成千上万种极端情况、特殊指令、游戏开发者无意或有意利用的原始硬件漏洞,以及一些由于缺乏官方文档而无法描述的时序特性。
另一个因素是法律压力。任天堂尤其以动用法律手段而闻名。2024年2月,任天堂对热门模拟器Yuzu的开发商提起诉讼,指控其非法绕过Switch的加密保护,证据是《塞尔达传说:王国之泪》在正式发售前下载量就已突破百万。
Yuzu 的开发商 Tropic Haze 同意支付 240 万美元达成和解,并彻底关闭了该模拟器。不久之后,任天堂也亲自联系了竞争对手 Ryujinx 的首席开发者,要求其停止开发,并解散该组织及其所有相关资产。这些案例清楚地表明,为什么许多才华横溢的开发者更倾向于选择更为“安全”的旧主机平台,而新项目往往默默无闻,或者分散在同一个项目的多个分支中。
为什么有些游戏机比其他游戏机更难破解?
一般来说,游戏主机的内部架构越接近标准PC,就越容易进行模拟。PlayStation 1和2使用相对传统的处理器,因此它们很早就被模拟出来,如今即使在配置较低的硬件上也能流畅运行。但当厂商采用他们自己的非标准解决方案时,例如PS3上的Cell处理器,模拟的复杂性就会呈指数级增长。同样,基于Nvidia定制Tegra芯片的任天堂Switch,在内存和图形管理方面也有其独特的特性。
对于最新一代的PlayStation 5和Xbox Series X/S来说,情况更加复杂。这些主机架构更接近现代计算机(采用AMD Zen处理器和RDNA图形架构),但同时又拥有比以往任何一代主机都更加先进的安全机制。目前,这两款主机几乎没有可用的模拟器,因为开发者仍在破解其基础安全层,这与传统的硬件模拟相比,难度更大,也更耗时。
手机和电脑上的模拟器有什么区别?
移动设备上的模拟器面临着用户通常看不到的额外障碍。这是因为几乎所有手机都采用 ARM 处理器架构,而 PC 上则普遍采用 x86 架构。因此,当在手机上运行基于 x86 或 PowerPC 的游戏主机模拟器时,程序必须同时将指令从原始架构翻译成 ARM 指令,这增加了一层额外的计算工作,而 PC 上的主机处理器通常已经是 x86 架构,所以不需要进行这种额外的计算。
此外,苹果直到最近才真正禁止在iPhone上使用模拟器。直到2024年4月,苹果才首次在其App Store指南中明确允许复古游戏机模拟器,这些模拟器现在还可以提供游戏下载。在此之前,在iPhone上使用模拟器的唯一方法是越狱或通过复杂的网页应用绕过限制。
即使做出这些改变,仍然存在一些限制。出于安全考虑,iOS 严格限制了所谓的 JIT 编译,即在程序执行期间动态生成机器代码,而 JIT 编译是实现高要求模拟器可接受速度的主要技术。因此,许多 iPhone 上的模拟器运行速度明显慢于 Android 上的同类项目,因为 Android 上几乎没有此类限制,而且开发者多年来一直拥有对系统资源的更开放的访问权限。
有没有Windows模拟器?比如Winlator、GameHub、GameNative……
如果你读过我的手机评测,你会发现除了安卓和任天堂Switch游戏之外,我经常还会测试各种Windows游戏。在这种情况下,“模拟器”这个词用得并不完全准确。它更像是一系列相互叠加的兼容层。
Winlator 是一款由网名为 BrunoSX (brunodev85) 的开发者开发的免费开源应用程序,它无需 BIOS、无需启动真正的 Windows 系统、也无需磁盘映像,即可在基于 ARM 架构的 Android 设备上直接运行 Windows (x86_64) 应用程序和游戏。Winlator 结合了两种不同的技术,每种技术都解决了各自的问题。第一种是 Wine,这是一个知名的项目,几十年来一直致力于将 Windows API 调用(例如打开文件、访问注册表、通过 Direct3D 绘制图形或播放音频的命令)转换为 Android 后台运行的 Linux 内核可以理解的命令。
第二项技术是 Box86 或 Box64,它执行一项更为基础的任务。由于目前没有任何手机实际搭载 x86 处理器,因此它能够实时地将处理器指令从 x86 架构翻译成 ARM 架构。此外,还有一个图形层。Winlator 使用 Mesin Turnip 驱动程序来驱动 Adreno GPU,并使用 DXVK 和 VKD3D 工具将 DirectX 调用转换为 Vulkan,类似于 Linux 系统上 Proton 的工作方式。
用户在应用程序内创建一个所谓的容器,这是一种隔离的虚拟环境,用户可以在其中为每个游戏或程序分别设置分辨率、虚拟显存量、处理器核心数和驱动程序。
由于需要进行两次连续转换(先是 API 调用,然后是处理器指令),手机硬件的负载远高于传统主机模拟器。这也是为什么 Winlator 运行一些老游戏或对硬件要求不高的游戏比较流畅,但运行使用虚幻引擎等高性能图形引擎的现代 AAA 级游戏时,经常会出现着色器编译卡顿和设备发热严重的问题。目前为止,RedMagic 11S Pro 在散热方面表现最佳,但它为此采用了风扇和水冷散热。

GameHub 和 GameNative 有什么区别?
当 Winlator 变得足够流行时,围绕它出现了竞争对手,它们基本上使用相同的技术配方(Wine、Box64、Vulkan),但在所有内容的包装友好程度上有所不同。
GameNative 由 Pluvia 项目发展而来。Pluvia 是一款非官方的 Steam 客户端,允许用户通过 Winlator 登录 Steam 账号,并直接从游戏库启动游戏,无需手动在线搜索安装文件。GameNative 是 Pluvia 项目的衍生产品,目前其开发速度和活跃度均超过了原项目。
GameHub 的起源略有不同。这款应用前身为 GameFusion,由中国游戏控制器制造商 Gamesir 开发,其主要优势在于便捷性。它支持 Steam 登录(官方 Winlator 默认不支持此功能),并且还支持控制器震动。由于其出自中国硬件制造商之手,用户群体中出现了隐私方面的担忧,因此 Gamesir 开发了不带内置追踪功能的 GameHub Lite 版本。
是模拟结果更好,还是模拟整个设备更好?
模拟器并非总是需要重现原始系统的每一个晶体管。它们通常采用高级仿真(HLE)方法。模拟器不会详细模拟整个硬件或系统软件,而是识别游戏想要实现的功能,并用自己的实现方式来执行相同的操作。
与此相反的是 LLE(底层仿真),开发者试图尽可能接近原始硬件或固件的实际行为。
HLE 的速度可以显著提升。问题在于,当游戏没有按预期使用某个功能时。如果游戏开发者发现了真实系统中一个未公开的特性并有意利用它,那么优雅的 HLE 实现可能会做出“逻辑上正确”的操作,而原版主机却可能完全不同。
为什么有的游戏运行正常,而有的游戏却完全无法启动?
如果模拟器能够模拟 PlayStation 2,那我运行哪款 PS2 游戏又有什么关系呢?因为没有两款游戏对主机的使用方式是完全相同的。
一款游戏可能只使用最常见的图形功能,而另一款游戏则使用不寻常的“混合”技术。一款游戏使用标准的浮点运算,而另一款游戏则依赖于非常特殊的舍入方案。一款游戏使用标准控制器,而另一款游戏则使用麦克风或特殊配件。第三款游戏可能包含一个赛车引擎,其运行无意中依赖于处理器事件的精确时序。
因此,测试模拟器与测试普通应用程序并不相同。一个真正有效的回归测试需要一个包含成百上千款游戏的库。
然后,官方发布了一个补丁,虽然最终让一款游戏正常运行,但却破坏了另外三款游戏。

具有讽刺意味的是,“赝品”往往比原版更好。
当模拟器足够精确时,模拟的游戏画面和性能甚至可能比原版更好。
一款原本为 480p 分辨率制作的游戏,可以通过模拟器以 1440p 或 4K 分辨率渲染。它可以以更高的原生分辨率渲染几何体,改进纹理过滤,使用现代抗锯齿技术,校正宽高比,在某些情况下还能解除原有的帧率限制。模拟器还能提供快速存档、时间回溯、替换纹理、修复程序以及一些在原版主机上根本不存在的修改功能。
有时候模拟器在 Linux 系统上的运行效果比在 Windows 系统上更好。
许多模拟器和转换层,例如 Proton,在 Linux 系统上的表现更佳。这主要归因于操作系统与硬件的通信方式。Vulkan 是一种现代且开放的图形接口,与 Windows 上一些较旧但仍常用的方案相比,它能提供更低的 CPU 占用率和对显卡更直接的控制。此外,近年来 Vulkan 的 Linux 驱动程序也日趋成熟,其系统开销通常比 Windows 版本更低。
此外,Proton 内置的 DXVK 工具能够实时将 DirectX 调用转换为 Vulkan,其速度通常比 Windows 直接执行原生 DirectX 调用更快,因为它避免了 Linux 系统中不存在的某些操作系统层。Linux 还允许更低的进程间通信延迟和更可预测的系统内核线程调度,这对于需要在每一帧中协调数十个并行任务的模拟器来说是一项宝贵的优势。
要想进入模拟器开发领域,你必须既是高手又是疯子。
当你忙于处理CPU指令、API调用、安全机制,并默默祈祷索尼和任天堂不要找上门时,你还得承受着社区的殷切期望——毕竟,你开发这款模拟器并非为了盈利。然而,少数人,尤其是那些声音很大的人,往往抱有过高且毫无根据的期望,认为开发这类软件相对容易。既然有任天堂Switch的模拟器,那么开发任天堂Switch 2的模拟器应该也不难吧?
每一次新的突破实际上都意味着要花几个月的时间来查找漏洞、阅读机器代码的十六进制转储,并试图理解二十年前编写代码的工程师(包括现在的工程师和过去的工程师)的决策,他们当时并没有想到会有人尝试在完全不同的硬件上重新创建它。
正是这种固执、好奇心和对保护游戏传统的热爱,才使得模拟技术得以存在,也正是这种热爱,使得每一代游戏主机的竞争几乎都会从头开始。


















