游戏引擎 · 一款 2004 年的赛车游戏在浏览器里重新上线:机器码被逐个函数翻译成 C
十一月七日,HN 首页挂出一个链接,八百多个赞。打开是一个网址,nfsu2.xyz。《极品飞车:地下狂飙 2》——二〇〇四年的赛车游戏,卖点是在车库里改装一辆本田思域,深夜的城市里飙红灯。它现在跑在 Chrome 和 Firefox 里,宽屏,最高一百二十帧,支持手柄和方向盘,还能联机。原版的联机死了十多年了,当年靠…
十一月七日,HN 首页挂出一个链接,八百多个赞。打开是一个网址,nfsu2.xyz。《极品飞车:地下狂飙 2》——二〇〇四年的赛车游戏,卖点是在车库里改装一辆本田思域,深夜的城市里飙红灯。它现在跑在 Chrome 和 Firefox 里,宽屏,最高一百二十帧,支持手柄和方向盘,还能联机。原版的联机死了十多年了,当年靠的是 GameSpy 的服务器,二〇一四年那批服务器一关,线上模式就成了回忆。
这个复活的实现路径,跟模拟器是两条完全不同的路。模拟器是在浏览器里装一台假电脑,游戏代码原封不动,靠解释执行,一层软件垫一层软件,慢。这个项目做的是静态重编译:写一个 Python 的提升器,拿 Capstone 反汇编引擎把 SPEED2.EXE 里的每一个函数逐一读出来,翻译成等价的 C 源码;翻译完的 C 再交给 wasi-sdk 编译成 WebAssembly。整个翻译发生在构建期,一次性做完。浏览器里跑的,是编译好的产物——没有解释器,没有运行时翻译的税。
难点根本不在翻译指令,在指令之外。一款 Windows 游戏的周围站着一家子的系统服务:Direct3D 9 管画面,DirectSound 管声音,DirectInput 管手柄,Windows API 管一切杂务。这些在浏览器里统统不存在。项目的运行时层把它们一一重造:D3D9 的渲染路径映射到 WebGPU,声音走 AudioWorklet,游戏原本的多线程搬到 Web Worker 上共享一块内存。相当于给游戏造了一间合身的房子,房子外面才是浏览器。
这条路不是凭空出现的,它有清晰的族谱。二〇一九年,超级马里奥 64 被社区完整反编译成 C,玩家版的 PC 移植由此而生——但反编译是苦役,一个游戏要团队啃几年。二〇二四年,N64Recomp 换了思路:不做完整反编译,直接把 N64 的 MIPS 机器码静态翻译成 C,几秒钟出活,《梅祖拉的假面:Recompiled》是这条路的标杆。二〇二五年,XenonRecomp 把同样的手艺搬到 Xbox 360 的 PowerPC 芯片上,《索尼克: unleashed》的 PC 原生版做了示范。二〇二六年,NFSU2Recomp 把目标换成了 x86——PC 游戏自己的机器码。每一次换代,都是同一个问题的重新作答:怎么让一段为死掉的平台写的代码,在新的世界继续跑。
联机是这次复活的另一半。EA 的官方服务器早已不在,项目用一个 Rust 写的服务器把事情接过来:它给玩家分发页面和编译好的游戏模块,也负责把不同的人接进同一片自由漫游的城市——车队同色,好友可以一键加入对方的世界,存档跟着账号走。用你自己的旧光盘?不,用你自己的旧文件:网站要求玩家提供北美 v1.2 版 SPEED2.EXE,字节数 4,800,512,连 SHA-256 哈希都对得上才放行。仓库本身一行游戏代码都不含,翻译产物也不入库——版权的边界划在这里,EA 名下的东西一样没碰。
还有一个细节值得单独端出来看。仓库的 README 写着:Built with the help of Claude Code。做静态重编译的人,用编码代理把这件事干完了。这件事本身有种回环的趣味——三年前这门手艺还需要顶尖逆向工程的老手,现在一个爱好者借助代理就能把整个 exe 翻进浏览器。游戏保存运动的工具链,正在被下一代工具重写。老游戏不会死,只要还有人愿意把它们的机器码,一个函数一个函数,搬进新的容器里。
信源与限定:站点功能(宽屏、120 帧、联机、车队、好友加入)、x86 机器码翻译为 C 后编译 WebAssembly、Capstone 提升器、wasi-sdk、Windows/D3D9/DirectSound/DirectInput 运行时重造、WebGPU/AudioWorklet/Worker 共享内存、Rust 服务器分发与联机、BYO 校验(4,800,512 字节与 SHA-256)、仓库不含游戏代码、MIT 许可、基于 Talha Müderrisoğlu 的 NFSU2Recomp(2026 年 10 月 16 日 MIT 版)、N64Recomp/XenonRecomp 方法谱系、"Built with the help of Claude Code",出自 th0mk/nfsu2-web 仓库 README 与 nfsu2.xyz 站点说明;HN 11 月 7 日 1114 分讨论为热度口径;超级马里奥 64 反编译(2019)、N64Recomp(2024,代表作梅祖拉的假面 Recompiled)、XenonRecomp(hedge-dev,2025,索尼克 Unleashed Recompiled)为社区项目公开记录;GameSpy 2014 年关服致原版联机终止为业界公知事实。120 帧为站点自述上限口径。
#游戏引擎 #静态重编译 #WebAssembly #游戏保存 #逆向工程