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

Лукас Фогель отрисовал 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)