Show HN:把《雷神之锤》移植到安全 Rust,可直接在浏览器里玩

查看原文 HN 讨论

文章摘要

quake-srp 是一个可以直接在浏览器里打开就玩的《雷神之锤》(Quake,id Software 1996 年作品)。项目名里的 SRP 是作者自嘲的「slop rust port」,即「AI 糊出来的 Rust 移植版」。网页本身只是一个游戏外壳:点击开始、捕获鼠标后就能用 WASD + 鼠标玩 id 免费发布的共享版第一章(E1M1–E1M8),页面上附有按键说明、控制台作弊指令(god、noclip、give 等)以及「拖入你自己的 pak1.pak 即可玩完整版和资料片」的提示。真正的技术内容在 GitHub 仓库的 README 和 STATUS 文档以及一段六分钟的讲解视频里。

它是什么。 这是从 id 以 GPL 开源的 WinQuake C 源码逐文件翻译成 Rust 的单人版本:文件格式与 QuakeC 虚拟机、服务端物理、怪物与战斗、基于边排序的软件渲染器、状态栏、菜单、控制台、混音器都包括在内,没有多人模式。作者给自己定了按优先级排列的几条规则:零依赖(只用 Rust 标准库)、不写一行 unsafe(每个 crate 都加了 #![forbid(unsafe_code)])、「经典模式」必须被证明与 id 原版一致,以及代码质量要达到「可展示」的水准。

怎么证明「一模一样」。 这是项目最有意思的部分。作者把 id 的 C 源码无界面地编译出来作为「神谕」(oracle),然后让移植版与它逐项对拍:3D 视图在数千个视角下逐像素比对(包括怪物醒着、正在攻击的场景),状态栏/菜单/控制台的 2D 画面、混音器逐采样比对,演示录像回放时逐帧比对摄像机、所有实体与动态光源。一条命令 classic_check.py 就能跑完十项检查并输出 ALL PASS。README 还专门讨论了「到底和哪个 C 比」:gcc 默认的 x87 浮点会把部分变量留在 80 位寄存器里,结果取决于寄存器分配而非源码本身;而 1996 年玩家实际看到的画面又是 FPU 设为 24 位精度、向零舍入的第三种算术。因此像素检查以 SSE2 构建(严格按 C 声明的类型舍入)为目标,在所有试过的视角下做到零像素差异。

「slop」选项。 除了忠实还原的 Classic 预设,默认的 slop 预设展示「如果硬件不再是瓶颈,软件渲染的 Quake 会是什么样」:按窗口原生分辨率整数倍渲染、宽屏更大视野、取消 72 fps 帧率上限(同时把跳跃、升降机、闪光等按 72 Hz 的手感步进)、怪物在 id 原本 0.1 秒一跳的位置之间平滑插值、火把轻微闪烁、透视校正从每 16 像素一次提高到每 8 像素,以及修了混音器的四个 bug。画面仍然是 8 位调色板、纹理不做滤波。所有与原版的差异都是可单独开关的命名设置。

浏览器里怎么跑。 引擎是一个库,每帧输入玩家操作、输出一张 8 位图像、调色板偏移和声音调用。浏览器版是一个普通的 WASI main 程序,跑在 Web Worker 里:输入事件从 stdin 进入,画面和 PCM 音频通过共享内存交还给页面,用 WebGL2 着色器像 VGA DAC 一样查调色板,AudioWorklet 播放 id 原版混音器的输出,存档和配置以真实文件形式保存在 IndexedDB。渲染器在完成单线程的 BSP 遍历和边扫描后,把画面切成行带分给所有 CPU 核心,且任意线程数下输出逐字节一致。它还支持手柄(带震动)、手机触屏(只能横屏)、离线安装为 PWA。

怎么做出来的。 README 坦白写明:代码和文档全部由 Anthropic 的 Claude 在 Claude Code 中写成,人类负责定规则、试玩和报告问题。大部分工作由「智能体舰队」完成,每个智能体在自己的 git 分支上按书面任务说明工作,再由一个「主持」智能体在完整检查通过后才合并。作者在 HN 上补充说,这是一个历时约四个月的业余项目,「说不清多少时间是在干活,多少时间是在等下一个模型」。

HN 评论精华

这个帖子拿到 236 分、178 条评论,但需要先说明:讨论的大部分篇幅并不在 Quake 本身,而是围绕「这是 LLM 生成的项目,值不值得发到 HN」以及由此延伸出的「AI 克隆/逆向软件的安全隐患」两场争论。技术层面的高质量讨论主要集中在视觉回归测试上。

作者自述与「LLM 是否该被嘲讽」

视觉回归测试:本帖最有干货的分支

安全与「AI 克隆一切」的延伸争论

轻松一面