Новый дом Doom — это база данных
Doom нашел новый дом: базу данных. SQLDoom, проект Лукаса Фогеля из CedarDB, — это не просто игра, хранящая рекорды в базе данных, и не визуальная имитация. Это полноценная переработка оригинального Doom 1993 года, где основная игровая логика и отрисовка графики выполняются полностью на SQL.
Эта архитектура элегантно разделена. Игровая логика и движок рендеринга работают как SQL-запросы, а Python выступает в роли легкого моста. Роль Python ограничена захватом ввода с клавиатуры, управлением таймингом игрового цикла и отображением полученного кадрового буфера. Каждый кадр, который вы видите, является результатом одного массивного SQL-запроса.
Масштаб этой работы впечатляет. Разрешение игры 320x200, составляющее 64 000 пикселей, вычисляется рендерером, который включает около 1300 строк SQL и около 89 обобщенных табличных выражений (CTE). Игровая логика добавляет еще 5900 строк SQL. Весь этот SQL-код заметно короче, чем оригинальные 9000 строк логики на C в Doom.
Один запрос рисует 64 000 пикселей
Каждый кадр, отрисованный в SQLDoom, берет начало из одного сложного запроса к базе данных. Этот запрос вычисляет цвет для каждого из 64 000 пикселей (разрешение 320 × 200) на экране, возвращая изображение в виде необработанных растровых данных, где каждая строка представляет один пиксель. Только запрос рендеринга занимает около 1300 строк SQL и использует около 89 обобщенных табличных выражений (CTE).
Реляционные операции фундаментально отличаются от традиционного процедурного кода. Вместо явных циклов, перебирающих игровые объекты, SQLDoom использует операции на основе множеств (set-based operations) для коллективной обработки сущностей. Это позволяет, например, одному оператору UPDATE изменять состояние всех монстров одновременно, что резко контрастирует с многочисленными циклами for или while в оригинальной реализации на C.
Показатели производительности впечатляют для игры, работающей на базе данных. Основная игровая логика придерживается оригинальных 35 тиков в секунду Doom, обеспечивая аутентичный темп игры. Однако рендерер может достигать до 60 кадров в секунду (FPS) на современном оборудовании за счет интерполяции положений камеры между этими игровыми тиками, что обеспечивает более плавный визуальный опыт, чем в оригинале 1993 года. Лукас Фогель из CedarDB эффективно продемонстрировал удивительные возможности SQL в качестве игрового движка.
База данных берет на себя всю тяжелую работу
Рендеринг Doom в базе данных представляет собой интересный компромисс. Оригинальный движок 1993 года, созданный Джоном Кармаком, мастерски экономил циклы процессора с помощью деревьев Binary Space Partitioning (BSP) для определения видимости. SQLDoom, напротив, использует метод «грубой силы» для вычисления глубины и окклюзии для всех 64 000 пикселей в кадре. Это делает видимость самой медленной частью конвейера рендеринга SQL.
Этот подход «грубой силы» жизнеспособен только благодаря архитектуре CedarDB. Ее движок запросов компилирует SQL-запросы непосредственно в LLVM IR, а затем в машинный код, что позволяет выполнять сложные аналитические задачи с впечатляющей скоростью — до 60 кадров в секунду на ноутбуке. Эта компиляция имеет решающее значение для обработки 1300 строк SQL в одном запросе рендеринга, как описано в блоге проекта: We Ported the Original Doom to SQL - CedarDB.
Сам игровой мир превращается в структурированные данные. Культовые ресурсы WAD из Doom, которые определяют всё — от геометрии карт до текстур, — находят новые места в виде реляционных таблиц. К ним относятся:
- Карты
- Сектора
- Линии (Linedefs)
- Текстуры
Даже отдельные предметы, такие как дробовик, становятся строками в таблице, что позволяет использовать прямой SQL для изменения игровой механики, например, обновить оружие, чтобы оно стреляло 500 дробью с помощью простого оператора UPDATE. Это делает весь игровой мир доступным для запросов и модификации с помощью стандартных операций с базами данных.
Нравится статья? Получайте такие каждое утро на почту.
одно письмо в день · отписка в два клика · без сторонних трекеров
Когда игровая механика становится редактируемыми строками
Необычный дизайн также приносит удивительные результаты. Поскольку оружие и характеристики игрока хранятся в виде данных таблицы, одно обновление SQL может изменить количество дроби в дробовике или базовое здоровье игрока. Это демонстрирует динамические возможности базы данных, хотя в реальном матче такие прямые манипуляции были бы ограничены.
Функциональность многопользовательской игры естественным образом вытекает из транзакций базы данных. Каждый игровой тик обрабатывается как изолированная транзакция, гарантируя, что все игроки запрашивают согласованное, синхронизированное представление игрового мира. Ограниченные функции не позволяют клиентам напрямую изменять защищенные значения, такие как их собственное здоровье, поддерживая целостность игры.
SQLDoom выходит за рамки простой новизны, служа строгим испытательным стендом для механизмов запросов баз данных как вычислительных платформ. Этот проект основан на более раннем прототипе ASCII-рейкастинга Lukas Vogel, DOOMQL, расширяя границы того, чего могут достичь реляционные базы данных. SQLDoom предлагает нам переосмыслить, как другие сложные игровые механики могут быть представлены и выполнены в виде чистых данных и запросов.
Часто задаваемые вопросы
Что такое SQLDoom?
SQLDoom — это проект Lukas Vogel из CedarDB, который переносит игровую логику и графический рендеринг Doom на SQL.
Работает ли SQLDoom полностью на SQL?
Игровая логика и рендерер работают на SQL. Python обрабатывает ввод с клавиатуры, тайминг и отображение отрендеренного кадра.
Сколько пикселей рендерит SQLDoom за кадр?
Он вычисляет 64 000 пикселей за кадр, что соответствует разрешению Doom 320 на 200.
Как SQLDoom обрабатывает многопользовательский режим?
Игровые тики выполняются как транзакции базы данных, предоставляя игрокам синхронизированное представление общего игрового состояния.

