Найти в Дзене
Цифровая Переплавка

DOOM на SQL: когда база данных становится игровым движком

Иногда самые странные идеи оказываются удивительно рабочими. Лукаc Вогель построил многопользовательский шутер в стиле DOOM, написанный… целиком на SQL. Да, никакого игрового движка, OpenGL или даже сложной сетевой логики. Всё — от карты и состояния игроков до рендера и синхронизации — реализовано средствами базы данных CedarDB. Все сущности — это таблицы: 🗺 map — хранит уровень, стены и точки респауна.
🧑‍🤝‍🧑 players — здоровье, патроны, счёт.
⌨️ inputs — ввод игроков (w, a, s, d, x для стрельбы).
⚙️ config — настройки скорости, лимиты боеприпасов. Любое действие — это SQL-запрос: И, конечно, моддинг «на лету» — можно прямо во время матча менять конфигурацию игры. Визуализация — цепочка VIEW и рекурсивных CTE. 🔦 Raycasting: для каждого игрока SQL-рекурсия «пускает лучи», чтобы определить видимые тайлы.
🎭 Спрайты: отображаются с учётом глубины и перспективы.
🧩 string_agg: собирает кадр построчно в текстовую «рамку». В результате игрок видит 3D-вид и миникарту, полностью собранные
Оглавление

Иногда самые странные идеи оказываются удивительно рабочими. Лукаc Вогель построил многопользовательский шутер в стиле DOOM, написанный… целиком на SQL. Да, никакого игрового движка, OpenGL или даже сложной сетевой логики. Всё — от карты и состояния игроков до рендера и синхронизации — реализовано средствами базы данных CedarDB.

Игра как база данных

Все сущности — это таблицы:

🗺 map — хранит уровень, стены и точки респауна.
🧑‍🤝‍🧑
players — здоровье, патроны, счёт.
⌨️
inputs — ввод игроков (w, a, s, d, x для стрельбы).
⚙️
config — настройки скорости, лимиты боеприпасов.

Любое действие — это SQL-запрос:

  • Движение: UPDATE inputs SET action='w' ...
  • Пополнение здоровья или патронов: UPDATE players SET hp=100 ...
  • Читерство: UPDATE players SET hp=100000 WHERE player_id=<you>;

И, конечно, моддинг «на лету» — можно прямо во время матча менять конфигурацию игры.

Рендеринг в стиле SQL

Визуализация — цепочка VIEW и рекурсивных CTE.

🔦 Raycasting: для каждого игрока SQL-рекурсия «пускает лучи», чтобы определить видимые тайлы.
🎭
Спрайты: отображаются с учётом глубины и перспективы.
🧩
string_agg: собирает кадр построчно в текстовую «рамку».

В результате игрок видит 3D-вид и миникарту, полностью собранные в SQL.

Игровой цикл: shell + SQL

Вместо движка используется скрипт:

while true; do
psql -f gameloop.sql
sleep 0.03
done

Внутри gameloop.sql:

  • Двигаются пули.
  • Проверяются коллизии со стенами и игроками.
  • Начисляются очки за убийства.
  • Респаун погибших.

Каждый тик — транзакция, поэтому состояние всегда согласованное. Это тот случай, когда ACID напрямую работает на геймдизайн. Для справки ACID — это свойства транзакций в БД, гарантирующие их атомарность, согласованность, изолированность и надёжное сохранение изменений.

Многопользовательский режим без боли

SQL-сервер уже умеет синхронизировать состояние и изолировать транзакции. Чтобы добавить мультиплеер, понадобилось… два запроса:

🎮 отрисовать экран: SELECT ... FROM screen WHERE player_id=?
⌨️
отправить ввод: INSERT INTO inputs ... ON CONFLICT DO UPDATE

Синхронизация «просто работает» — то, над чем программисты сетевого кода обычно бьются неделями.

Читерство как метагейм

Так как клиенты могут слать произвольный SQL, появился новый уровень игры: читинг в SQL.

🩸 «Лоу-скилл»: обнулить всем соперникам HP.
😈 «Креатив»: красть чужие убийства, перепривязывая owner у пуль.
🛡️ Но: из-за атомарности транзакций некоторые хаки не проходят — к моменту, когда вы пытаетесь удалить пулю, она уже нанесла урон.

Здесь прекрасно видно, как свойства СУБД (изоляция, атомарность) влияют на игровой процесс.

Моё мнение

С практической точки зрения — да, идея «писать DOOM на SQL» звучит безумно. Поддерживать такой код почти невозможно, а производительность ограничена. Но в этом эксперименте кроется важный урок:

  • База данных и игровой сервер концептуально похожи: обе системы синхронизируют общее состояние.
  • SQL оказался удивительно выразительным языком для описания игрового мира.
  • CedarDB показал, что транзакции и оптимизация запросов могут работать даже в «реальном времени».

Это не про замену Unity или Unreal, а про расширение горизонтов. Когда разработчики начинают играть с инструментами на грани возможного, рождаются новые подходы, которые однажды могут найти реальное применение.

📎 Источники: