概要
- DOOMQL は、SQLだけで作られた マルチプレイヤーDOOM風シューター。
- CedarDB を活用し、ゲームの全構成要素を データベース上で管理・同期。
- レンダリングやゲームループ もSQLで実装、クライアントはPythonで最小限。
- チートや観戦モードもSQLコマンド で実現可能。
- パフォーマンスは 30FPS超、マルチプレイも容易な設計。
DOOMQL:純SQLで作るDOOM風マルチプレイヤーシューター
- DOOMQL は、 CedarDB を利用し、ゲームロジックからレンダリングまで 全てSQLのみ で構築したDOOM風シューティングゲーム。
- データベースサーバ を従来のゲームサーバのように使い、 状態同期やトランザクション分離 でマルチプレイヤーに対応。
- ゲーム状態(マップ、プレイヤー、敵、入力、設定、スプライトなど) を全てテーブルで管理。
- 例:
configテーブルでゲーム設定、mapテーブルでマップ構造、players/inputsでプレイヤー情報と操作を保持。
- 例:
- レンダリングパイプライン もSQLビューで実装し、 レイキャスティングやスプライト投影 を再現。
- ゲームループは シェルスクリプト で30回/秒SQLファイルを実行、クライアントは 約150行のPython で入力送信&描画取得。
アーキテクチャと全体構成
- 状態管理 :ゲーム全体の状態・設定・マップ・プレイヤー情報等を SQLテーブル に格納。
- レンダリング :2Dマップ情報を基に レイキャスティングをSQLビュー で実装、プレイヤーごとに3D風ビュー生成。
- ゲームループ :1フレームごとに SQLトランザクション で弾丸・衝突・リスポーン等を一括処理し、整合性を確保。
- クライアント : Pythonスクリプト で入力送信(
inputsテーブル)、描画取得(screenビュー)。 - チート や観戦も SQLコマンド で簡単実現。
レンダリングパイプラインとビューの仕組み
- レイキャスティング :各プレイヤーの視点から複数のレイを発射し、 壁や敵の可視判定 を再帰SQLで実行。
- 可視タイル計算 ビューで、壁やオブジェクトの当たり判定&距離計算。
- スプライト描画 :敵やアイテムの 投影・LOD選択・ピクセル展開 もSQLで処理。
- フレームバッファ :
string_aggでテキスト行を結合し、 3Dビューやミニマップ、HUDを組み立て。 - HUD :HPバーや弾丸数も
repeat関数等でSQL生成。
ゲームループ処理例
- 弾丸移動・削除 :壁や範囲外で消去、プレイヤーとの衝突でHP減少&スコア加算。
- リスポーン :HPゼロのプレイヤーをランダムなリスポーン地点へ移動、HP/弾薬リセット。
- 全処理を1トランザクション で実施し、 状態不整合やレースコンディション防止。
マルチプレイ対応のシンプルさ
- 描画取得 :
screenビューから自分のplayer_idで3Dビューを取得。 - 入力送信 :
inputsテーブルへアクション書き込み(既存ならUPDATE)。 - 観戦モード :
player_idを切り替えるだけで他プレイヤー視点も閲覧可能。
パフォーマンスと特徴
- 128x64ピクセル の描画で1ビューあたり約33ms、 30FPS以上 を達成。
- DuckDB DOOM (8FPS/32x16ピクセル)に比べ高性能。
- CedarDB のクエリ最適化で、無駄なレンダリングを回避。
- SQLのみ でここまで実現できる柔軟性と拡張性。
まとめ:SQLでゲームを作る意義
- データベース=ゲームサーバ の発想転換。
- トランザクション制御 で一貫性・マルチプレイ・観戦・チート対応も容易。
- 実用性はともかく、 SQLだけで3Dレンダリングやゲームループ まで完結できる面白さ・技術的挑戦。
- CedarDBの高性能を活かした 新しいゲーム開発手法の提案。