Двадцать шестой год двадцать первого века, а «Запуск Doom на X» по-прежнему, вероятно, самое популярное хобби в сфере взлома программного обеспечения. От тестов на беременность до космических спутников, игра 1993 года была портирована практически на всё, что имеет процессор и некоторую память. Теперь пришло время запустить игру в базе данных, в данном случае CedarDB, благодаря проекту SQLDoom Лукаса Фогеля, который ранее создал DoomQL.
Если вы задаетесь вопросом, как, черт возьми, можно запустить игру в SQL, на самом деле это гораздо проще, чем вы думаете, если мыслить как архитектор баз данных. Фронтенд, отображающий графику, воспроизводящий звук и принимающий ввод, написан на Python, но эта часть действует только как периферийные устройства ПК — вся математика выполняется внутри базы данных.
Бэкенд написан для производительной, совместимой с Postgres СУБД CedarDB. Подобно современным портам Doom, SQLDoom использует два потока: один работает с оригинальной частотой игры 35 Гц для обработки всей логики, а отдельный поток — для отображения графики, интерполируя положение камеры между обновлениями игры.
Для начала Фогелю пришлось преобразовать сущности из файла пакета WAD игры Doom в базы данных. Это оказалось проще, чем ожидалось, поскольку данные в нем «уже высоко реляционные», причем Фогель приводит пример уровней карт, структурированных в отношениях родитель-потомок, которые тривиально воспроизвести в обычных таблицах. Потребовалось всего 1000 строк кода на Python.
Что касается основного игрового цикла, Фогель снова был приятно удивлен, что игровая логика легко поддается преобразованию. Полученный код составил 5900 строк SQL по сравнению с 9000 строк исходного кода на C. Большая часть экономии была достигнута за счет того, что, в то время как для обновления значений приходится итерировать по сущностям с помощью циклов «for» или «while», в SQL достаточно простого «UPDATE… WHERE» для выполнения этой задачи в одном операторе — и, что немаловажно, параллельно. В качестве дополнительного бонуса тот факт, что все является строкой в таблице базы данных, позволяет легко вносить мгновенные изменения, такие как изменение характеристик оружия или поведения врагов на лету.
Графический рендерер также невелик — 1300 строк, но он сложнее, поскольку представляет собой один запрос, охватывающий 89 таблиц. Фогель отмечает, что конвейер в конечном итоге очень похож на конвейер Doom. Данные для революционного тогда алгоритма Binary Space Partitioning (BSP) от Кармака, реализации двоичных деревьев, легко представляются в виде таблицы.
Каждое левое/правое значение может быть преобразовано в бит, и, в конечном итоге, значение порядка вершин может быть сведено к одному числу. Таким образом, простой «SELECT… ORDER BY» автоматически сортирует стены от переднего плана к заднему. Забавно, что я использовал ту же технику базы данных, когда писал систему комментирования с ветвлением для ныне несуществующего Tech Report. Несмотря на все усилия, Фогель говорит, что рендереры пола и потолка не очень хорошо отобразились в SQL, поскольку в конечном итоге это умные алгоритмы заливки.
Когда дело дошло до многопользовательской игры, использование базы данных оказалось намного лучше, чем в оригинальной игре. Причина проста: поддержание синхронизированных состояний между множеством таблиц с большим количеством взаимозависимостей — это именно то, для чего предназначены базы данных, поэтому снимки, аутентификация, контроль доступа — все это фактически бесплатно и реализовано для вас. Чтобы выполнить игровой тик, все, что вам нужно, это «START TRANSACTION», выполнить логику и «COMMIT», и все волшебным образом синхронизируется.
Вы можете просмотреть или скачать SQLDoom из его репозитория на GitHub или прочитать увлекательный пост в блоге Фогеля, подробно описывающий это приключение.
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Bruno Ferreira




