---
source_url: https://cedardb.com/blog/sqldoom/
source_title: "We ported the original Doom to SQL"
tags: doom,sql,game-engine,database,graphics
generated_at: 2026-10-05T08:01:14.771Z
model: claude-haiku-4-5
---
# 元祖 Doom をSQL に ポートして動作させた

1993年のオリジナル Doom のゲームロジックとレンダラーをSQL クエリとしてデータベース内で実装し、動作させるプロジェクトが完成した。ゲームループは元の 35 FPS で動作し、レンダラーは 320x200 ピクセルのフレームを最大 60 Hz で生成する。マルチプレイのデスマッチは4プレイヤースロットで機能する。

開発者によると、「1993年のオリジナル Doom のゲームロジックとレンダラーをSQL に ポートしてデータベース内で実行しました。ゲームループはオリジナルの 35 FPS で動作し、レンダラーはラップトップ上で完全な 320x200 フレームバッファを最大 60 Hz で生成します」という。

## ゲーム実装の規模

ゲームロジックはおよそ 5900 行のSQL コードで実装されており、これはオリジナルC ソースコードの約 9000 行に相当する。レンダリングパイプラインはおよそ 1300 行のSQL 87コードで構成され、単一フレームのクエリ内に 89 個の共通テーブル式（CTE）を含む。元のlinux_doom ソースではレンダリングエンジンに約 3300 行を費やしていたことと比較すると、SQL での実装は元の実装の約 2.5 倍のコード行数削減を実現している。

![SQL版とVanilla版の比較](https://cedardb.com/blog/sqldoom/vanilla_vs_sqldoom.png)

## パフォーマンス特性

最も遅いゲームティックは E4M1 レベルで46体の覚醒モンスターがいる場合の 10.45 ミリ秒であり、これは 28.6 ミリ秒の時間予算の 37 パーセントに相当する。一方、覚醒モンスターが6体の典型的なティックは平均 2.15 ミリ秒で、予算全体の 8 パーセントを使用する。壁のレンダリングは平均 1.7 ミリ秒のコストがかかり、床・天井・空のレンダリングは一般的に約 3 ミリ秒を要する。

![Game loop waterfallの最悪ケース](https://cedardb.com/blog/sqldoom/tic_waterfall_worst.png)

## ゲーム機能と互換性

マルチプレイのデスマッチは4プレイヤースロットで完全に機能し、シェアウェア版の第1エピソードが公開サーバーでプレイ可能である。Python はタイミング、キーボード入力、ビットマップ表示を担当し、すべてのゲームロジックと描画がSQL 内で実行される。

WAD ファイルフォーマットは高い関連性を持つ設計になっており、1000 行のPython コードでWAD ファイルをデータベースに変換できる。Doom 1 全体のインポートはラップトップ上で約 18 秒で完了する。

## レンダリング構造

Doom のレンダリングアルゴリズムはBSP ツリーを使用して前から後ろへと描画を行う。E4M8 レベルに含まれる最も深いBSP ツリーの深さは 32 レベルに達する。

![CTEの有向非巡回グラフ（DAG）](https://cedardb.com/blog/sqldoom/cte_dag.png)

## 筆者の見立て

- 実際にDoom をポートすることは、単にDoom のように見えるフレームをレンダリングするだけではなく重要であったと論じている
- Doom は単にプレイするのが素晴らしいと述べている
- SQL でゲームロジックを表現することは思ったより簡単だったと述べている
- これはゲームロジック実装について異なる考え方を強制されると解釈している
- SQL はエンティティコンポーネントシステム（ECS）パターンを理解させる可能性を示唆している
- Doom をSQL にポートすることが最初から良いアイデアだったかは別の問題だと論じている

*この記事は元記事の事実のみに基づいて自動生成されました。*

## 出典

CedarDB「We ported the original Doom to SQL」https://cedardb.com/blog/sqldoom/
