本文へオリジナルの「Doom」をSQLに移植しました
概要
- Doom のゲームロジックとレンダラーを完全に SQL へ移植し、データベース内で実行
- Python はタイミングと入出力のみ担当、本体処理は全てSQL
- オリジナルと同じ 35FPS でゲームループ動作、レンダラーは 60Hz 対応
- マルチプレイ やライブ状態のSQLクエリもサポート
- ECS的発想をSQLで実現、データ指向設計の可能性を示唆
SQLDoom: DoomをSQLで動かす試み
- 1993年の名作FPS「 Doom」のゲームロジックおよびレンダリング処理を SQL だけで再現
- Python スクリプトは入力取得・フレーム表示・タイミング制御のみ担当
- ゲーム処理・状態管理・描画は全て DB内部 で完結
- 35Hz のゲームループでオリジナルの操作感・テンポを忠実に再現
- レンダラーは 320x200 のフレームバッファを 最大60Hz で生成
- マルチプレイ (デスマッチ・4人同時)対応、サーバーはEU/USで稼働
- 全席埋まっても 観戦・状態クエリ が可能
技術的アプローチとアーキテクチャ
- DoomのWADファイル (マップ・オブジェクト情報)は元々リレーショナル、DBへの移植が容易
- Pythonスクリプトから 1/35秒ごと に「ゲームティック」SQL関数を呼び出し
- レンダリングは状態テーブルを参照する 純粋関数 として実装、クライアントは好きなタイミングでフレーム取得可能
- ゲームデータのインポートは約1000行のPythonコード、全WAD読込に18秒程度
ゲームループとAIロジック
- ゲームティックごとに 入力処理・敵AI・アイテム取得・弾道計算・爆風判定 等をSQLで実装
- 各ティックの予算は 28.6ms、最も重いシーンでも 10.45ms、通常は 2.15ms
- 敵AIは 再帰CTE と 条件分岐 で実装、死亡・爆発・攻撃などの状態遷移もSQLで表現
- ECS(Entity Component System)的設計:各エンティティは複数テーブル(位置・状態・スプライト等)で管理、各システムはUPDATE/INSERTで処理
レンダリングパイプライン
- 1フレーム= 89個のCTE からなる巨大なSQLビュー
- BSPツリーによる 可視判定・クリッピング・投影・スプライト合成 等をSQLで表現
- 出力は RGB値のバイト列 として返却、Python側でビットマップ表示
- 実装は約 1300行のSQL、オリジナルCソースよりも簡潔
まとめ・意義
- SQL のみで高度なゲームロジックとリアルタイムレンダリングを実現
- ECSパターンの本質をSQLで体感、データベース駆動開発の新たな可能性
- データローカリティ・並列処理の利点を活かし、複雑な処理も高速に実行
- DOOMQL から始まった試みが、ついに「本物のDoom」レベルへ到達
バニラCよりもコードの行数が少なくて、クエリプランニングをステートマシンとして使うのは、まさにエンジニアリングの悪行の極みだね。好きだわ。