一个名为 ilreb 的开发者把 1996 年的 Quake 游戏引擎搬进了现代浏览器。这个名为 Quake-SRP 的项目没有任何外部依赖,整个代码库不允许出现一处 unsafe。三十年前的 C 语言被全量翻译成安全的 Rust,编译为 WebAssembly 跑在一个 Web Worker 中。用户甚至能直接把硬盘里原封不动的 pak1.pak 或者任务包拖进页面加载游玩,运算全部在本地完成。
C 源码整体编译成 WASM,交给 Web Worker 跑
id Software 在 1996 年开源的 Quake 源码是一座满是手动内存管理与指针位移的迷宫。在这个移植项目中,作者保留了原版 WinQuake 的 CPU 软件渲染器以及 8 位调色板,没有改走 GPU 加速渲染的路线。WebGL2 只承担最后一道工序,把算好的像素搬到屏幕上。涵盖第 2 到第 4 章内容的 pak1.pak、任务包的 pak0.pak 甚至 CD 音轨都可以拖进页面,文件不出浏览器。
把一个高度依赖底层硬件交互的旧世代引擎放进 Web Worker,是一次架构层面的替换。所有 WebAssembly 逻辑都在后台线程里吃满 CPU,主页面只负责传递鼠标键盘事件,并从共享内存里取回画面和音频。放弃 GPU 硬件管线、用浏览器单核性能硬扛三十年前的软件渲染逻辑,换来的是把复杂运行环境带来的不确定性压到最低。 这个看似笨重的选择,让一场漫长且容易脱轨的跨平台重构,退化成了一道纯粹的输入输出翻译题。
验收标准是逐帧像素比对
Quake-SRP 真正的工程支点是一套自动化验证装置。为了确保大模型移植的精准度,项目单独编译了一份原版 C 源码的无头版本,把它当作整个测试链路的唯一基准。测试套件在 9 张地图上、两种分辨率下跑满数百个帧,怪兽处于活动状态,再把新引擎输出的渲染像素、界面元素、音频输出以及 demo 回放中的游戏状态,与参考实现逐项比对。README 同时记录了已知差异,没有声称两边行为一模一样。
在模拟器开发圈里,视觉比对体系并不新鲜,Dolphin 早就有成套的视觉持续集成。不过把整段 3D 帧序列做逐像素比对,还要处理 mipmap 采样与光照边缘的细微差异,和前端日常的 DOM 快照测试不是同一个量级。模型单次能生成多少代码从来不是成败的重点,能否让机器自主辨别像素级差异,才是把代码生成拉回现实的锚点。 参考实现不亮绿灯,语法再漂亮也过不了关。
图:Classic 预设下的 E1M1 画面(1280×960),严丝合缝地对应原版 WinQuake 的行为。来源:quake-srp 仓库截图
图:默认预设下的同一关卡(1920×1080),引入了宽屏视野与不锁帧的改动。来源:quake-srp 仓库截图
协调 Agent 只在全部检查通过后合并分支
项目 README 记下了这场人机协作的权责分界。Claude 是代码、重构和文档的主要作者,人类负责设定约束条件、试玩、报告问题,以及在各个 agent 生成的分支之间调度。项目还设了一个协调 Agent,只有全部检查通过它才合并分支。
这种分工把验证代码正确性的重活交给了另一段行为确定的参考实现,人不再逐行审阅机器写的逻辑。项目留了复刻原版行为的 ?classic 参数,默认模式 ?slop 则加上宽屏与不锁刷新率。人只对两种最终形态的游玩体验负责,试错、内存泄漏和指针越界的修补成本则压在生成器这一侧反复消耗。
图:透视贴图跨屏贴合的比对示意图,这是项目自己的图像比对装置工作时的切片。来源:quake-srp 仓库截图
同一套流程可以搬去 COBOL 主机迁移
Quake 引擎的重构除了复古的验证价值,展示出的工作流还让社区里不少工程师想到存量最大的那块历史债务。有开发者在讨论区分享了自己的经历:Claude 在处理类似的引擎逆向工作时,主动跑起回放脚本,定期截图做双向验证,还自己去读原版代码、给原版打补丁让游戏状态机变成确定性。当机器主导的验证与重写被证明可靠,话题自然延伸到了至今仍在核心金融主机上运转的 COBOL 银行系统。
高昂的人工验证成本与难以穷尽的边界逻辑,是这些老系统迟迟没能安全迁移到云原生架构的真正原因。业务逻辑可以用旧代码完整描述,但盘根错节的依赖让没人敢承担重写风险,这正是双向制衡体系最能发挥作用的场景。一旦有一台高精度的输入输出比对装置跑起来,大型主机的架构迁移就从一次押上团队声誉的冒险,变成一场消耗算力与时间周期的代码对冲。
这套能力也能用来伪造指令接口
同样的能力并不只朝着一个方向发挥。如果一套由代码生成模型和验证装置组成的循环,能靠着不断报错、比对与修正把一个上世纪九十年代的复杂游戏引擎无损翻译,那么它同样具备读懂并复现其他封闭系统内部状态转移规则的能力。讨论区的另一条线索指向了反面:这种高效率的黑盒逆向重构如果被用来对付关键业务的基础设施,同样能生成足以骗过防护网的伪造指令和欺骗性接口。有人反驳说,能被复现的系统本身就是靠「安全性来自不被了解」在撑场面,暴露它反而迫使其换代;立刻有人回击,工控 HMI 这类系统的指令接口一旦能被克隆,影响的就不只是几笔交易。
一个能自动寻找差异特征、补齐逻辑漏洞的模型,本质上就是一台不断逼近可计算逻辑的拟合器,而它并不区分手里拆解的对象是开源的娱乐软件,还是带锁的工业控制底层设施。回到 Quake-SRP 本身,它用零 unsafe 的代码证明的判断很朴素:面对庞大且古老的逻辑迷宫,人类与其在机器生成的代码海洋里打捞错误,不如先造出一台足够精密的自动化像素比对仪。这台仪器既能推动旧世界重组,也是给代码生成器划下的硬约束。
参考链接:
- GitHub 仓库介绍
- Quake-SRP 在线演示
- Hacker News 社区讨论