Лукас Фогель отрисовал Doom в SQL-базе данных: проект SQLDoom

Разработчик Лукас Фогель (Lukas Vogel) в подробной записи в блоге рассказал, как заставил SQL-базу данных рисовать Doom. Он сам начинает с оговорки: «Рендерить Doom в базе данных, очевидно, плохая идея». Ars Technica уточняет, что утверждение не совсем точное: у проекта SQLDoom есть небольшой клиент на Python, который обрабатывает ввод и вывод, задаёт темп игры и выводит каждый кадр на экран.
Всё остальное происходит внутри базы. Набор таблиц CedarDB хранит геометрию уровня и состояние игры, а около 1300 строк SQL-запросов, разнесённых по 89 общим табличным выражениям (common table expressions), реализуют игровую логику и генерируют 35 растровых кадров в секунду. Кадры полноцветные, размером 640×480, и, по описанию Ars Technica, выглядят так, будто их выдал оригинальный исполняемый файл Doom.
SQLDoom, заметный шаг вперёд по сравнению с прошлогодним проектом Фогеля DoomQL, цель которого, многопользовательский шутер в духе Doom целиком на SQL. Тот проект закончился чёрно-белой ASCII-графикой на основе бросания лучей (raycasting), больше похожей на простые карты с прямыми углами из Wolfenstein 3D.
По словам Фогеля, перевести классические WAD-файлы Doom в реляционную базу оказалось относительно просто, потому что игра делит уровни на вершины, линии, секторы и так далее. Даже знаменитые деревья двоичного разбиения пространства (BSP) удаётся разложить на SQL: для объектов заранее, при загрузке, вычисляется sort_key для каждой позиции. Тогда обычный оператор ORDER BY на каждом кадре определяет, какие части стен показывать, а какие отбросить, что заметно ускоряет работу.
Ключевые факты
- SQLDoom, проект Лукаса Фогеля: Doom рисуется запросами к базе CedarDB, Python-клиент отвечает только за ввод, вывод, темп игры и показ кадров.
- Логика и генерация кадров занимают около 1300 строк SQL, распределённых по 89 общим табличным выражениям.
- Проект выдаёт 35 растровых кадров в секунду, полноцветных, размером 640×480.
- Прошлогодний DoomQL давал чёрно-белую ASCII-графику на основе бросания лучей; SQLDoom заметно превосходит его.
- Ключевой приём: sort_key, вычисляемый при загрузке уровня, превращает обход BSP-деревьев в обычный ORDER BY.
Почему это важно
Это не прорыв, а наглядная демонстрация того, как далеко можно растянуть возможности SQL. Игровой движок с полноцветной картинкой 640×480 и 35 кадрами в секунду, живущий в запросах и таблицах, показывает, что данные уровней Doom ложатся на реляционную модель почти естественно: вершины, линии и секторы превращаются в строки таблиц. Для самого Фогеля проект, большой шаг от ASCII-графики DoomQL к картинке, похожей на оригинал.
Кому это важно
Любителям игровой классики и «а запустится ли на этом Doom», а также разработчикам, которым интересны нестандартные применения баз данных и SQL. Практической пользы для бизнеса из текста не следует: сам автор называет затею очевидно плохой идеей.
Как это применить
Прямого применения в источнике не описано. Интересна идея, которую можно перенять как приём: заранее вычислить ключ сортировки (sort_key) при загрузке данных, чтобы сложный обход структуры, такой как BSP-дерево, заменить обычным ORDER BY. В пересказе Ars Technica не сказано, открыт ли код проекта и где его взять.
Можно ли доверять
Это пересказ Ars Technica подробной записи в блоге самого Фогеля; цитата и технические детали переданы через издание. Заявленные 35 кадров в секунду приведены без указания оборудования и условий замера, а также без уточнения, среднее это значение или пиковое.
Риски и подводные камни
Это развлекательный технический эксперимент, а не рабочий метод для игр. Название «Doom в базе данных» несколько упрощает картину: ввод, вывод, темп игры и показ кадров обеспечивает внешний клиент на Python. Цифры производительности не подкреплены описанием условий замера, поэтому сравнивать их с другими реализациями нельзя.
«Рендерить Doom в базе данных, очевидно, плохая идея.»
— Лукас Фогель, из записи в блоге о проекте SQLDoom (цитата в материале Ars Technica)