世界を動かす技術を、日本語で。

純粋なSQLでDOOM風のマルチプレイヤーシューティングゲームを構築する

概要

  • 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の高性能を活かした 新しいゲーム開発手法の提案

Hackerたちの意見

これは面白い広告だね!彼らのことは知らなかったから、技術を調べてみたよ。Postgresql互換のHTAPみたい。シングルサーバーでクローズドソースっぽいね。ロードマップもあるよ。

このマルチプレイヤー、Postgresqlで動くのかな?

もし私の理解が正しければ、これはUmbraという研究用DBの商業化で、かなりすごいパフォーマンス特性を持ってるんだ。

これ、狂気だわ。クリンガー、あんたか?やりすぎだよ。猫耳少女のホログラムには賛成だけど、アーチャーのクリンガーの科学はいいね。でも、SQLがDoomを動かすなんておかしいよ。科学の限界が狂気を超えてる!まあ、「Doomが動くか」って話はよく出るけど、リアルな狂気の科学者なら「猫耳少女が動くか」を先に解決すべきじゃない?

Krieger、あんたか?やりすぎだよ。これはFar Cry 1のリファレンス?

ソースコードを見たいなら、リポジトリはこちらだよ!

皮肉抜きで、これってレイマーチングを表現するのにめっちゃエレガントな方法だよね。 https://github.com/cedardb/DOOMQL/blob/f14b5ef9ef0b23045376b...

これの論理的な極限は、マルチプレイヤーゲーム用に作られたデータベースだと思う。例えば、これみたいなやつ:ただ、そこでメインのゲームロジックはRustかC#で書くことになるけどね。

「DBに直接ロジックを組むのがいいんじゃないか」って、シンプルなマルチプレイヤーオンラインRPGとかで考えたことがある。データベースから画面への直接的なマッピングが多いからね。でも、'twitch' ゲームにこのアイデアを使うのは本当にすごいね。

実は、DOOMQLを作ってる時にゲームにSQLが使えるか考えたことがあるんだ。ゲームロジックをSQLクエリで表現するのがめっちゃ簡単だからね。OSRSのヘビーユーザーとして、次はシンプルなMUD/MMOを作ろうかなって思ってた。SpacetimeDBの情報ありがとう!前は聞いたことなかったよ。

ここで言及されたDuckDB-DOOMの作者だよ!これ、すごいね - マルチプレイヤーは素晴らしい追加要素だ。ミニマップのコーンも本当に好きだよ。

これは結構面白いね。WADファイルが読み込まれると思ってたけど、これもかなり良かった。Windows XPのJS版よりもいいかも。

投稿: https://news.ycombinator.com/item?id=43761998

それを気に入ってくれて嬉しい!君のプロジェクトがインスピレーションになって、実現可能なんだって思わせてくれたよ :D

これはWolfenstein 3Dに近いと思う :)

なぜか、この手のプロジェクトは「Doomクローン」と呼ばれることが多いけど、当時のDoomの特徴は持ってないのにね。正直、これだけでも十分すごいから、「[90年代のゲーム]クローン」っていう必要はないと思う。

これが年齢を感じさせるんだろうね。私にとって、すべての2.5DシューティングゲームはDOOMライクなんだ。最初はQuakeライクって呼ぼうと思ったけど、IMHO、そっちの方がマルチプレイヤーで有名だからね。でも、パワーアップとか他の期待される要素を実装する時間がなかったんだ。

正直言って、OG Wolfと初期のテキストベースの「一人称」RPG、リアルタイム更新が組み合わさった感じがするなぁ。唯一の不満点は、asciidoomみたいな8/16ビットのドゥームがいろいろあるのに、なんであんなに良いUXやビジュアルがなかったのかってことかな。

ASCIIモードのビデオドライバーが出る前のテキストモードのドゥームを思い出す。ちょっと検索したけど、サイトが見つからなかったな。Wayback Machineかな?

前のトレンドは、できるだけ多くの制約のあるデバイスでDOOMを動かそうとしてたけど、今は予想外の場所でチューリング完全性を証明しようとして進化した感じだね。

こういう極端な試みは、ドゥームを動かしてるとは言えない気がする。技術的には純粋なSQLでのドゥームって感じで、実際に動かしてるわけじゃないし(ハードウェアを示唆するからね)。Doom(風)CAPTCHAやTypeScriptの型でのDoomみたいな他の試みも、未完成だったり、プレイできなかったり、あまりにも抽象的すぎて、注目を集めたくて必死な叫びに見える。とはいえ、みんなそれぞれ変わった興味があるから、好みは人それぞれだよね。こういう馬鹿げた試みが、もっと表現力のあるアート的な努力から注意をそらさないことを願ってる。例えば「Thatcher's Techbase」や「Kriegsland: Blutorden」、「Blades of Agony」、HDoomみたいなドゥームの他の試みもあるし。