开发者在CedarDB数据库中运行《毁灭战士

开发者在CedarDB数据库中运行《毁灭战士》。SQLDoom项目将游戏逻辑转为约5900行SQL代码,利用数据库特性简化循环并支持多人游戏事务处理,相关代码已开源。

“在 X 上运行 Doom”依然是软件黑客领域最受欢迎的挑战之一。从怀孕测试设备到太空卫星,这款 1993 年的经典游戏已被移植到几乎所有具备 CPU 和内存的硬件上。如今,这一极限挑战延伸到了数据库领域,开发者成功在兼容 Postgres 的关系型数据库管理系统 CedarDB 中运行了《毁灭战士》。

SQL代码量比原版C减少35%

该项目名为 SQLDoom,其前端显示图形、播放声音及接收输入的功能由 Python 编写,而后端则专为以性能为重点的 CedarDB 打造。架构师 Vogel 指出,只要像数据库专家一样思考,在 SQL 中运行游戏的难度远低于预期。

SQLDoom 采用了类似现代 Doom 端口的双路径设计:一个路径以 35 Hz 的频率处理所有游戏逻辑,另一个独立线程负责渲染图形,并在两次游戏更新之间插入摄像头位置数据。

数据转换与代码精简

Vogel 首先将《毁灭战士》WAD 包文件中的实体转换为数据库结构。由于原始数据具有高度关系性,例如地图层次可自然映射为父子关系并存储在平面表中,这一过程仅耗时约一千行 Python 代码。

在游戏主循环方面,逻辑转换同样高效。最终生成的 SQL 代码约为 5,900 行,相比原始 C 源代码的 9,000 行大幅减少。这种精简主要得益于 SQL 的特性:C 语言中需要遍历实体并使用 for 或 while 循环来更新数值,而在 SQL 中只需一条简单的 UPDATE... WHERE 语句即可实现相同操作,且支持并行执行。此外,基于行的数据存储使得即时修改(如实时调整武器属性或敌人行为)变得极为简便。

图形渲染与 BSP 算法

图形渲染器虽然仅有 1,300 行代码,但复杂度较高,涉及对 89 张表的联合查询。Vogel 表示,该渲染管线最终与《毁灭战士》原版管线高度相似。John Carmack 当年革命性的二叉空间分割(BSP)遍历算法本质上是一种二叉树实现,其数据结构可以很容易地表示为一张表。

通过将每个左/右值转换为比特,并将顶点顺序值简化为数字,一个简单的 SELECT 查询即可自动完成墙壁从前到后的排序。不过,Vogel 也承认,尽管付出了最大努力,地板和天花板的染色器功能未能很好地映射到 SQL 结构中。

多人游戏体验优化

在多人游戏模式下,使用数据库反而带来了优于原始游戏的体验。由于数据库原生支持快照、身份验证和访问控制等功能,这些特性无需额外开发即可免费获得。运行一场游戏标签赛所需的步骤被简化为:BEGIN TRANSACTION(开始交易)、运行逻辑以及 COMMIT(提交)。

目前,SQLDoom 的代码已托管于 GitHub,用户可直接浏览或下载。Vogel 也在博客文章中详细记录了整个开发过程中的技术细节与挑战。

评论 0

0/500

评论需审核后展示,请文明发言

💬
还没有评论,来说两句

相关阅读