這個專案叫 SQLDoom,是資料庫公司 CedarDB 的工程師 Lukas Vogel 在帶薪親假期間做的作品。他先前做過一個用光線投射技術的 DOOMQL,但那比較接近 Wolfenstein 3D,不是真正的 Doom。這次他想做出「真正的 Doom 在 SQL 裡跑」,也就是重現原版 Doom 用來處理牆壁深度與視角的 BSP 樹(二元空間分割樹)演算法。
整個遊戲邏輯用了大約 5900 行 SQL 寫成,比原始 C 語言的 9000 行還精簡,採用「Entity Component System」架構,每個遊戲物件是資料表裡的一行,每個系統則變成一道 UPDATE 或 INSERT 指令,連怪物的 AI 狀態機都用 CASE 判斷式和遞迴 CTE(公用表運算式)表達。畫面渲染更是整個寫成一個龐大的 SQL 視圖,用了 89 個 CTE、約 1300 行 SQL,把 BSP 樹的走訪轉成排序問題,牆壁像素用 generate_series() 展開,深度計算則用「把所有資訊打包成一個 bigint 再取最小值」的技巧來處理。
效能表現上,遊戲邏輯平均每個 tic(遊戲時脈,約 28.6 毫秒一次)只花 2.15 毫秒,在 AMD Ryzen 7 7840U 的機器上渲染速度多半能維持 60 FPS,忙碌場景也有 35 FPS。因為 CedarDB 會把 SQL 編譯成機器碼而不是逐行直譯執行,效能和原始 C 語言版本的差距比想像中小。作者在文章最後感嘆,Doom 原作者 John Carmack 在 1993 年設計的 BSP 演算法,直到現代硬體搭配 SQL 編譯技術才真正展現出有多巧妙。
這則新聞比較偏技術展示與產業面的炫技,不是給初學者的教材,但很適合拿來跟正在學程式的孩子說明:資料庫不是只能拿來存資料查資料,演算法和資料結構設計得好,即使換一種完全不同的工具(SQL)也能做出令人驚訝的東西,激發他們對「基礎觀念學扎實,工具換了也能用」的想像。
開源資料庫遊戲開發演算法