有人在 SQL 数据库里运行了 Doom
摘要
Lukas Vogel 的 SQLDoom 项目使用 SQL 数据库以 35 FPS 渲染全彩 640×480 的 Doom 画面,游戏逻辑由分布在 89 个公用表表达式中的约 1,300 行 SQL 实现,建立在他此前的 DoomQL 项目之上。
<p>“在数据库里渲染 <em>Doom</em> 显然是个糟糕的主意,”Lukas Vogel 在一篇<a href="https://cedardb.com/blog/sqldoom/">长篇博客文章</a>中写道,解释了他究竟是如何用 SQL 数据库渲染 <em>Doom</em> 的。</p>
<p>不过,这话也不完全准确。<a href="https://github.com/cedardb/sqldoom">SQLDoom 项目</a>其实使用了一个小型 Python 客户端来处理输入输出、驱动游戏时序,并将每一帧显示到屏幕上。在它背后,一系列 CedarDB 数据表跟踪着游戏的几何信息和状态,而约 1,300 行 SQL 查询分散在 89 个<a href="https://www.geeksforgeeks.org/sql/cte-in-sql/">公用表表达式</a>中,实现了游戏逻辑,并以每秒 35 帧的速度生成位图帧缓冲区。</p>
<p>在这方面,SQLDoom 相比<a href="https://cedardb.com/blog/doomql/">Vogel 此前的 DoomQL 项目</a>有了巨大进步。该项目去年的目标是“完全用 SQL 构建一个多人 Doom 风格的射击游戏”。遗憾的是,那次尝试最终呈现的是基于光线投射的灰度 ASCII 图形,更像《<em>Wolfenstein 3D</em>》中那种仅由 90 度直角构成的简陋地图。而新版 SQLDoom 则能生成全彩的 640×480 画面,看起来就像是出自原版 <em>Doom</em> 可执行程序。</p><p><a href="https://arstechnica.com/gaming/2026/10/can-it-run-doom-sql-database-edition/">阅读完整文章</a></p>
<p><a href="https://arstechnica.com/gaming/2026/10/can-it-run-doom-sql-database-edition/#comments">评论</a></p>
查看缓存全文
缓存时间: 2026/10/02 23:14
# 有人在 SQL 数据库里运行了 Doom
来源:https://arstechnica.com/gaming/2026/10/can-it-run-doom-sql-database-edition/
“在数据库里渲染 *Doom* 显然是个糟糕的主意,”Lukas Vogel 在一篇长篇博客文章(https://cedardb.com/blog/sqldoom/)中写道,解释了他究竟如何设法使用 SQL 数据库来渲染 *Doom*。
好吧,这个说法并不完全准确。SQLDoom 项目(https://github.com/cedardb/sqldoom)使用一个小型 Python 客户端来处理输入输出、驱动游戏时序,并将每一帧显示到屏幕上。在它背后,一系列 CedarDB 表用于跟踪游戏几何结构与状态,而大约 1,300 行 SQL 查询分布在 89 个公共表表达式(CTE,https://www.geeksforgeeks.org/sql/cte-in-sql/)中,实现了游戏逻辑并以每秒 35 帧的速度生成位图帧缓冲。
就此而言,SQLDoom 相比 Vogel 之前的 DoomQL 项目(https://cedardb.com/blog/doomql/)有了重大进步。该项目去年致力于“完全用 SQL 构建一个类 Doom 的多人射击游戏”。可惜的是,那次尝试最终得到的是基于光线投射的灰度 ASCII 画面,更接近《*Wolfenstein 3D*》那种只有 90 度转角的简陋地图。而全新的 SQLDoom 则能生成全彩的 640×480 帧画面,看起来几乎与原版 *Doom* 可执行程序输出的画面无异。
## 这一切都只是数据,朋友
Vogel 写道,将 *Doom* 经典的 WAD 文件转换为关系型数据库相对简单直接,因为原版游戏本身就把关卡分解成了顶点、线段、扇区等元素。就连 *Doom* 著名的二叉空间分割(BSP)树(https://en.wikipedia.org/wiki/Binary_space_partitioning)也可以拆解为 SQL,方法是在加载时为每个位置预先计算出一个用于排序的 `sort_key`。一旦在表中设置好这一项,一条简单的 “ORDER BY” 语句就能在每一帧中确定哪些墙段应该显示、哪些可以忽略,从而大幅提升了性能。
相似文章
我们把原版 Doom 移植到了 SQL 中
CedarDB 将 1993 年原版 Doom 的游戏逻辑和基于 BSP 的渲染器完全用 SQL 查询实现,在数据库内以 35 FPS 运行游戏循环,并提供了一个完整可玩的死亡竞赛演示。
DOOMQL
Peter Gostev 使用 SQLite 作为游戏引擎构建了一款类似 Doom 的游戏,通过递归 CTE 实现光线追踪,并与 Datasette 集成提供实时网页界面。该项目由 GPT-5.6 Sol 创建,展示了使用 SQL 构建游戏逻辑的创造性潜力。
在正则表达式引擎上运行《DOOM》
一位开发者演示了如何使用正则表达式引擎作为计算基础来运行《DOOM》游戏,每帧执行数百万次替换。
56,000行DOOM代码,用我自创的语言编写
作者构建了一种名为bet的玩笑编程语言,通过LLVM编译,采用基于区域的内存管理,并且成功运行了完整的DOOM游戏(56,000行代码),无需代码审查,仅依赖测试。
介绍DoomBench - 您的数据栈能运行DOOM吗?
CedarDB推出了DoomBench,这是一个基准测试,通过纯SQL运行一个多玩家类DOOM游戏,以压力测试数据栈在分析和事务工作负载下的性能,并提供直观的性能比较。