資料庫專家以 SQL 運行 Doom 遊戲邏輯僅 5,900 行程式碼

Os XJb TYc Ho B7Pvb PGLU4ij 1642 80

開發者 Lukas Vogel 推出 SQLDoom 專案,把 1993 年遊戲 Doom 的遊戲邏輯搬進資料庫執行,核心邏輯以 5,900 行 SQL 寫成,比原版 C 原始碼的 9,000 行更精簡。Doom 過去已被移植到由驗孕棒到太空衛星等各種裝有 CPU 與記憶體的裝置,如今輪到資料庫,Vogel 此前亦曾開發 DoomQL。

doom

Python 前端只負責輸入與畫面

SQLDoom 把所有運算放在資料庫內完成,顯示圖像、播放聲音及接收輸入的前端則以 Python 編寫,角色相當於個人電腦的周邊設備。後端針對講求效能、兼容 Postgres 的關聯式資料庫管理系統 CedarDB 編寫。與現代 Doom 移植版一樣,專案走兩條路徑:一條以遊戲原本的 35 Hz 處理所有邏輯,另一條獨立執行緒負責顯示圖形,並在兩次遊戲更新之間為攝影機位置插值。

WAD 資料轉為關聯式資料表

Vogel 首先要把 Doom 的 WAD 封裝檔內的實體轉換成資料庫。這一步比預期容易,因為當中資料本身已高度關聯式:地圖關卡最終可結構化成父子關係,用一般資料表重現並不困難,結果只用了 1,000 行 Python 便完成。

UPDATE 取代逐一迴圈

主遊戲循環同樣比 Vogel 預期容易轉換,最終程式碼為 5,900 行 SQL,對比原版 C 原始碼的 9,000 行。節省程式碼的其中一個原因,是原本需要使用 for 或 while 迴圈逐一走訪實體來更新數值,在 SQL 中只需一句 UPDATE…WHERE 便可在單一語句中完成,而且能夠並行執行。額外好處是,所有物件都是資料表中的一行,因此可即時修改武器特性或敵人行為。

渲染器橫跨 89 個資料表

圖形渲染器同樣細小,只有 1,300 行,但處理起來更棘手,因為它是橫跨 89 個資料表的單一查詢。Vogel 指出,這條管線最終與 Doom 十分相似:Carmack 當年劃時代的二元空間分割(BSP)遍歷屬於二元樹的一種實作,相關資料可輕易表示為資料表。每個左右值都可轉換成一個位元,頂點順序值最終可縮減為單一數字,因此一句 SELECT…ORDER BY 就能自動把牆壁由前至後排序。不過 Vogel 表示,地板與天花板的渲染器無法乾淨對應到 SQL,因為它們本質上是巧妙的洪水填充演算法。

多人模式同步更勝原版遊戲

多人遊戲方面,使用資料庫實際上比原版遊戲好得多,原因很簡單:在多個互相高度依賴的資料表之間維持同步狀態,正是資料庫的設計用途,因此快照、身分驗證及存取控制實際上都是免費且已為用家實作好。要執行一個遊戲 tick,只需執行 START TRANSACTION、運行邏輯,然後 COMMIT,一切便會自動同步。有興趣者可從 GitHub 儲存庫查閱或下載 SQLDoom,亦可閱讀 Vogel 撰寫的網誌文章瞭解整個過程。

加入本站 WhatsApp 頻道最新限免情報立即知。

全新本站官方《限時情報王》 iOS 版 登場。限免已完結?不想錯過重大限免應用,可到本站追蹤 Telegram 頻道、Facebook、Threads。