
CedarDB 工程师 Lukas Vogel 完成了一项极具极客精神的实验:他将经典射击游戏《毁灭战士》(Doom)的核心逻辑与渲染模块完全重构为 SQL 查询语句。在这套系统中,没有 C 语言代码,也没有自定义游戏引擎,仅靠数据库查询即可驱动游戏以每秒 35 帧的速度流畅运行。
用查询语句重写游戏引擎
该项目将《毁灭战士》的关卡数据导入 CedarDB,把原本由约 9,000 行 C 代码构成的游戏逻辑,转化为约 5,900 行 SQL 代码和 89 个公用表表达式(CTE)。Vogel 编写了约 1,000 行 Python 代码作为轻量级客户端,负责读取键盘输入、调用数据库查询并绘制返回的位图。
《毁灭战士》的 .wad 文件结构与关系型数据库高度契合:顶点、 linedef、sidedef 和 sector 等元素被直接映射为数据库表。原本用于可见性计算的二分空间树(BSP),被转化为带有预计算顺序键的可排序列。Vogel 在笔记本电脑上仅用 18 秒便完成了共享版关卡的数据导入。
渲染环节是技术难点。不同于此前仅能输出灰度 ASCII 画面的 DoomQL 项目,新版本通过一条巨大的查询语句遍历 BSP 树、确定可见表面、处理遮挡并投影精灵,最终返回完整的 RGB 位图。在搭载 AMD Ryzen 7 7840U 处理器的设备上,简单场景帧率可达 60 FPS,激烈战斗中也能稳定在 35 FPS 左右。单次包含六个怪物的游戏 tick 仅需 2.15 毫秒,即便在拥挤地图中,耗时也远低于原版引擎的时序要求。
事务一致性消除传统 Bug
数据库作为单一事实来源,通过事务机制确保了游戏状态的一致性。Vogel 表示,这种原子性操作消除了传统游戏引擎中常见的物理引擎 Bug 或状态不同步问题,“不存在未完全应用的更新,也没有关于火箭是否命中的争议”。
多人联机功能也因此变得直观。CedarDB 天然处理并发问题,目前已有服务器在欧洲和美国运行,支持四人对战。玩家不仅可以加入公共实例,还能直接通过 SQL 控制台查询实时比赛状态,因为在游戏中“一切皆是数据”。
技术演示背后的行业启示
该项目源于 Vogel 在育儿假期间的个人探索,旨在弥补其 2025 年早期项目 DoomQL 在视觉效果上的不足。尽管批评者指出,该方案依赖 CedarDB 特有的查询编译器(将 SQL 转换为 LLVM 机器码)及扩展功能,难以直接移植到 PostgreSQL 或 SQLite 等通用数据库,且频繁读写存在开销,但其性能表现仍显著优于早期版本。
对于数据库领域,这一演示证明了现代查询优化器处理复杂逻辑的能力;对于游戏开发,它揭示了《毁灭战士》原始设计与关系模型之间的惊人契合。目前,Vogel 已在 GitHub 开源代码,任何拥有 CedarDB 社区版及合法 WAD 文件的用户均可本地运行或加入公共服务器。
虽然无人计划用 SQL 开发下一代 AAA 大作,但这一“既被诅咒又令人惊叹”的移植作品迫使业界重新思考:还有多少程序隐藏着可被现代数据库激进利用的数据关系?Vogel 用查询语句让《毁灭战士》重新奔跑,给出了一个充满想象力的答案。