Лукас Фоґель запустив Doom у SQL за допомогою 5900 рядків коду
Розробник Лукас Фоґель створив SQLDoom — версію Doom, де ігрова логіка та рендеринг працюють у базі даних CedarDB.
Автор проєкту Лукас Фоґель створив SQLDoom — версію гри Doom, у якій основні обчислення виконуються всередині бази даних CedarDB. Проєкт містить 5900 рядків SQL-коду, працює з графікою на швидкості до 60 кадрів за секунду, підтримує звук і багатокористувацький режим. Про це повідомляє Tom's Hardware.
SQLDoom став продовженням попереднього експерименту Фоґеля під назвою DoomQL. CedarDB є сумісною з PostgreSQL реляційною системою керування базами даних, орієнтованою на продуктивність.
Логіка гри в базі даних
Графіку, звук і введення користувача обробляє зовнішній інтерфейс на Python, однак математичні обчислення гри виконуються в базі даних. Фоґель перетворив дані з WAD-файлу Doom на структуру таблиць: за його оцінкою, це виявилося відносно простим, оскільки дані гри вже мають реляційну структуру. Для такого перетворення знадобилося близько 1000 рядків Python-коду.
Ігрова логіка оновлюється з початковою для Doom частотою 35 Гц, а окремий потік відповідає за відображення зображення та інтерполяцію позиції камери між оновленнями. Автор порівняв обсяг SQL-коду з оригінальним кодом Doom мовою C, який налічував близько 9000 рядків.
Один запит для рендерингу
Графічний рендерер SQLDoom має приблизно 1300 рядків і використовує один запит, що охоплює 89 таблиць. Для визначення порядку відображення стін Фоґель застосував дані про обхід Binary Space Partitioning — бінарного дерева, яке використовував Doom. У результаті сортування об'єктів від переднього плану до заднього виконується через конструкцію SELECT з ORDER BY.
Водночас рендеринг підлоги та стелі виявився складнішим для реалізації мовою SQL, оскільки в оригінальній грі для цього використовуються алгоритми заливання.
Мультиплеєр і транзакції
На думку Фоґеля, база даних дала перевагу для багатокористувацького режиму. Синхронізація взаємопов'язаних даних, знімки стану, автентифікація та контроль доступу належать до штатних можливостей СКБД. Для виконання одного ігрового такту проєкт запускає транзакцію, виконує логіку гри та фіксує зміни командою COMMIT. Код SQLDoom і опис розробки автор опублікував у своєму репозиторії GitHub та блозі.