你大概从没想过,一个用来查数据、做报表的数据库语言,能跟一款三十多年前的射击游戏扯上关系。但有人真的这么干了——把初代《毁灭战士》整个搬进了SQL里。
对大多数非技术背景的人来说,SQL就是个管理大型数据集的工具。这确实是它被设计出来的用途。可它骨子里仍然是一门编程语言,带着C或Python这类通用语言才有的不少特性。它本来不是为通用任务准备的,但真拿它去做一些程序员意想不到的事,它居然也能扛下来。
![]()
他们到底做了什么
来自CedarDB的一个团队,把初代《毁灭战士》移植到了SQL上。这既是在展示SQL的能力,某种程度上也是在秀一把他们玩SQL的手艺。
项目把WAD数据——基本上就是除引擎之外的所有东西——存进了一系列表里。跟项目其余部分比起来,这一步还算简单。真正麻烦的地方在于两件事:一是管理把游戏锁在35 fps上的时序,二是渲染画面。
他们的渲染过程用了1300行SQL,分布在89个公共表表达式(CTE)里。对这门语言来说,这已经算是相当进阶的用法了。项目剩下的部分还有4000行SQL,另外配了一点Python,用来处理键盘输入、时序,以及显示生成的位图。
为什么偏偏是《毁灭战士》
说来有点反直觉,《毁灭战士》可能恰恰是最适合跑在SQL上的游戏。
它诞生在一个还没有专用显卡的年代,而且它并不是真正的3D。为了让它看起来像3D,当年的程序员不得不做大量取巧的处理。这些处理带来了很多数据变换,而这些变换恰好特别适合用SQL来做。
几乎可以说,《毁灭战士》最初的渲染器,就像是一个对SQL了如指掌的人写出来的。
想自己试试的话
这个项目的源代码已经放在GitHub上,感兴趣的人可以去找来跑跑看。
如果你对《毁灭战士》的各种奇葩移植版本有兴趣,还有别的选择:
- 一个用正则表达式实现的版本
- 一个跑在Microsoft Word里的版本
一款老游戏,一门老语言,凑在一起反而让人重新看了一眼那些被我们默认了用途的工具。SQL不只是查数据的,它还能做很多你以为它做不到的事——只是大多数人没往那个方向想过。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.