他把 Quake 移植到 safe Rust,还加了个「逐像素对齐」的验证器来证明没跑偏

Hacker News 上挂了个 Show HN,有人把《Quake》原版移植成了 safe Rust,还能直接在浏览器里跑,13 小时攒了 213 分、174 条评论。玩法本身不算新鲜,这几年见过不少在浏览器里跑老游戏的 demo,评论区真正热闹起来,是因为作者给整套移植配了一个东西——名叫「oracle」的视觉 diff 验证器,要求移植后的渲染结果和原版逐像素一致。

这个 oracle 的思路很直接:跑原版,跑移植版,逐帧截屏,然后像素对像素比对。有评论说得挺到点子上——这套思路本身就是 LLM 时代「让机器做我们能描述但懒得亲自动手的事」的绝佳示范。作者拿它当验收标准,让模型一路调到像素对齐为止,视觉类 bug 基本就被这套 harness 拦在门外。也有人指出,逐帧视觉 diff 在游戏移植圈不算新鲜,Dolphin 模拟器的视觉 CI 系统很早就在用,只是放到 3D 环境下,mipmap、灯光、合成这些自由度把难度抬高了好几档。

再说点技术底子。Quake 原版是 C 写的,不是 C++(id 第一款 C++ 游戏是 2004 年的 Doom 3),作者把它从 C 搬成 Rust,再用 WASM 编译跑进浏览器。有人专门去 grep 那个著名的 0x5f3759df 快速平方根倒数,没搜到——那是 Quake 3 的,Quake 1 里没有。至于「safe Rust」这层,评论区也有老实人泼冷水:零 unsafe 不等于就是理想代码,滥用索引和内部可变性照样能绕过 borrow checker;而且 Rust 发布版默认不查整数溢出。翻译腔一点讲,就是「安全」和「好玩」其实是两码事,游戏玩法 bug 仍然一个都不少。

最有意思的部分在作者自己的回应上。署名叫 airesQ 的作者说,这项目是他作为业余爱好做了大约 4 个月,他自己也说不清多少时间是纯干活、多少时间是「在等下一个更强的模型出来」。他不嫌麻烦,把这段工作流完整拍了个六分钟视频,还强调「视频是 AI 做的,人类辅助」。代码已经在 GitHub 上开源,仓库名很自嘲,叫 quake-srp,SRP 全称是「slop rust port」。

这事的争议点也很典型。有人不屑:LLM 干这种事早就不是新闻,纯属为了「能把 C 转 Rust」而转,图个便宜的多巴胺;也有人反驳,说评论区这些人当年看不上 C 版移植、现在又嫌 Rust 版太容易,作者其实真金白银投入了几个月,光验证 demo 播放就不简单。作者被顶到最高的一条回应说得挺诚恳:他觉得围绕 LLM 的讨论「莫名悲伤」——这些工具每天都犯错、吵得要死,但和它们协作确实是这几年最有回报感的事。「我们玩了一辈子乐高,现在乐高反过来懂我们,还帮我们一起搭积木。」这句话放这儿,倒比一堆评测靠谱。

对做移植、做老代码现代化的人,这是个值得看一眼的参考流程:一个可复现的像素级验收标准,加一段 4 个月持续投入的工作流。它没法替你判断「要不要把某套系统翻成 Rust」,但至少示范了怎么让 LLM 干活而不至于交付一堆没人验证的「看起来对」的代码。

相关链接:quake-srp 仓库 · oracle 视觉 diff 目录 · 演示站 quake-srp.pages.dev · 六分钟工作流视频