文章摘要
作者受到Patrick的DOOM克隆启发,决定在CedarDB的支持下,完全使用SQL构建一个类似DOOM的多人在线射击游戏DOOMQL。在为期一个月的育儿假中,他通过无数个不眠之夜实现了这一目标。文章详细介绍了DOOMQL的架构、SQL渲染管道、游戏循环以及通过SQL命令作弊的趣味玩法。作者认为,尽管DuckDB DOOM在浏览器中运行有趣,但部分渲染管道使用JavaScript感觉像是作弊,因此他尝试完全用SQL实现,并解决了帧率和视口大小的问题。
文章总结
标题:用纯SQL构建一个类似DOOM的多人在线射击游戏
主要内容:
作者受到Patrick的DuckDB DOOM启发,决定将这一想法推向极致:用纯SQL构建一个类似DOOM的多人在线射击游戏,并利用CedarDB处理所有繁重的计算工作。经过一个月的努力(主要是无眠的夜晚),作者成功实现了这一目标,并将其命名为DOOMQL。
为什么这么做?
虽然DuckDB DOOM在浏览器中运行很有趣,但作者对其中的一些设计感到不满,特别是部分渲染流程依赖于JavaScript。作者希望完全用SQL实现所有功能,并提升游戏的帧率和视口大小。此外,作者还希望实现带有透明度的真实精灵,并让它们在3D空间中流畅移动。最重要的是,作者认为将游戏改为多人在线模式应该不难,因为数据库服务器与传统游戏服务器在同步共享状态方面有相似之处。
架构概述:
- 状态存储在表中:包括地图、玩家、怪物、输入、配置、精灵等。
- 渲染通过SQL视图实现:使用射线投射和精灵投影技术。
- 游戏循环是一个简单的Shell脚本:每秒执行约30次SQL文件。
- 客户端约150行Python代码:负责轮询输入并从数据库中查询3D视图。
游戏状态:
所有游戏配置、状态和静态数据都存储在数据库中。例如,配置表、地图表、玩家和输入表等。由于所有内容都是数据,修改正在进行的比赛变得非常简单,例如更改设置、添加玩家、移动角色,甚至作弊。
渲染器:
在DOOM中,3D视图实际上是对2D状态的视图。通过SQL的VIEW,作者实现了类似的渲染流程,包括射线投射、精灵投影、帧缓冲组装等。具体步骤包括:
1. 从玩家视角发射射线,确定可见的地图瓦片。
2. 根据距离渲染墙壁。
3. 将怪物投影到玩家视角中。
4. 根据深度选择精灵的细节层次。
5. 将精灵扩展为像素并缩放到屏幕空间。
6. 处理遮挡。
7. 使用string_agg组装帧缓冲行。
8. 构建小地图。
9. 将3D视图、小地图和HUD组合成最终的游戏视图。
游戏循环:
游戏循环是一个简单的Shell脚本,每秒执行约30次SQL文件。在gameloop.sql中,子弹移动、碰撞、击杀和重生等操作都在一个事务中完成,确保状态的一致性。
多人在线模式:
游戏客户端的主要任务是渲染和发送输入。客户端通过SQL查询获取玩家的3D视图,并将输入插入到输入表中。游戏循环定期检查输入表并移动玩家,所有操作都在事务中进行,避免竞态条件。
性能:
在128x64像素的分辨率下,单个玩家的视图渲染时间约为33毫秒,足以实现约30帧/秒的流畅体验,相比DuckDB DOOM的8帧/秒有了显著提升。
作弊的元游戏:
由于客户端以超级用户身份发送原始SQL,游戏中出现了一个有趣的元游戏:玩家可以尝试通过SQL命令作弊,但要避免被其他玩家发现。
总结:
作者通过DOOMQL项目探索了将整个渲染流程用SQL实现的极限。虽然这种方法在性能上足够快,但在维护和调试方面却非常困难。然而,作者发现用SQL表达游戏状态和逻辑非常自然,甚至意外地重新发明了实体-组件-系统模式。多人在线模式之所以“正常工作”,是因为数据库系统处理了所有复杂的并发问题。
尝试DOOMQL:
所有代码都已开源,读者可以通过Docker运行CedarDB并启动游戏服务器,然后使用Python客户端进行游戏。作者还邀请感兴趣的读者加入他们的社区Slack进行讨论。
代码仓库: DOOMQL Repo
评论总结
评论内容总结:
技术认可与兴趣:
- 评论1对广告的创意表示认可,并进一步研究了相关技术,提到它是“Postgresql兼容的HTAP”(This is a clever ad! I had not heard of them so I looked up the technology behind it)。
- 评论3提供了源代码的链接,鼓励大家查看(If you want to take a look at the source code, here’s the repo!)。
对SQL运行Doom的争议:
- 评论2对SQL运行Doom表示震惊,认为这是“科学的极限被推向了疯狂”(SQL should not run Doom. The limits of science have been pushed beyond madness!)。
- 评论5的作者对多人游戏功能的加入表示赞赏(This is awesome - multiplayer is a great addition)。
游戏风格的讨论:
- 评论6和评论7认为该游戏更像是《Wolfenstein 3D》而非《Doom》(It’s clearly more untextured Wolfenstein 3d / I’d say this is more like Wolfenstein 3D)。
未来发展的设想:
- 评论4提出了将数据库用于多人游戏的极端设想(Feel like the logical extreme of this is a database built for multiplayer games)。
- 评论8则调侃性地建议在Neo4j中实现类似功能(Do it in Neo4j now lmao)。
总结:评论中对技术的创意和实现表示认可,但对SQL运行Doom的合理性存在争议。游戏风格被认为更接近《Wolfenstein 3D》,同时也有对未来技术应用的设想和调侃。