
Около месяца назад мы выпустили ролик [доступен также перевод на SE7ENе], посвященный техническим трудностям портирования Doom на консоль Neo Geo. Основная проблема заключается в архитектуре системы: у Neo Geo отсутствует классический буфер кадра, поэтому любой графический объект рендерится исключительно как спрайт. В том видео я делился наработками по созданию рейкастинг-движка, который неплохо чувствовал себя на этом железе. Концепция сводилась к отрисовке сетки из блоков, где для каждого вертикального ряда пикселей испускался луч. Разработчик Sabino даже представил любопытный прототип игры, вдохновленной стилистикой Doom.
Однако рейкастинг — это не полноценный движок Doom. Рейкастер ограничен сеткой из квадратных блоков, что исключает стены под произвольными углами, разноуровневые полы, лестницы и лифты. В проекте Sabino даже повороты за угол выглядели неестественно, что делало невозможным воссоздание таких культовых уровней, как E1M1: The Hangar.
К моему восторгу, сага о «Doom на Neo Geo» получила продолжение. Как я отметил в следующем выпуске, сообщество всерьез взялось за задачу, предложив принципиально новые подходы.
Первый из них — проект Doom 64 KB от энтузиаста FrenkelS. Это настоящий Doom, работающий на реальной BSP-геометрии карт без каких-либо упрощений. Разработчик буквально оптимизировал оригинальный код рендеринга так, чтобы он вписался в жесткие рамки Neo Geo.

Как это реализовано при отсутствии буфера кадра? FrenkelS хитроумно задействовал текстовый слой (fix layer), который обычно отводится под интерфейс, в качестве импровизированного микро-буфера. Зрители под первым видео оказались правы: этот метод действительно позволяет реализовать рендерер.
Результат впечатляет: E1M1 работает в разрешении 38 на 28 блоков, при этом сам код игры остался нетронутым. Пускай производительность далека от идеала, но это полноценный Doom!
Дальше — больше. Sabino, автор предыдущих экспериментов, предложил концепцию «спрайтового микро-буфера». Вместо текстового слоя он использует аппаратный блок масштабирования спрайтов, собирая картинку из крошечных блоков 4 на 4. Это позволило поднять разрешение до 80 на 56 пикселей. Картинка стала четче, а мозаичность заметно снизилась, правда, ценой возросшей нагрузки на процессор. С выходом новой реплики Neo Geo AES+, оснащенной функциями разгона, такие решения могут стать еще более жизнеспособными.

Второй проект, заслуживающий внимания, — Doom-NG от Retro Ports. Здесь используется движок VSlice. В отличие от стандартного рейкастинга, он опирается на обход настоящего BSP-дерева Doom. CPU определяет геометрию пространства и видимые объекты, а аппаратный блок масштабирования спрайтов берет на себя отрисовку. Это избавляет от зависимости от сетки и позволяет свободно исследовать реальные уровни Doom.

Разумеется, не обошлось без компромиссов: полы и потолки статичны (используются LUT-таблицы), дальние участки скрыты туманом для оптимизации, а текстуры обрабатываются блоками. Однако при запуске всех девяти уровней первого эпизода эффект присутствия поражает — это действительно Doom на Neo Geo.
Подводя итог: у нас есть два разных, но одинаково амбициозных подхода. Doom 64 KB делает ставку на «грубую силу» и полноценный рендерер, в то время как VSlice эффективно эксплуатирует возможности аппаратного скейлинга спрайтов. Ни один из них еще не готов к релизу, но это доказывает главное: при наличии инженерного таланта даже на архитектуре, не предназначенной для этого, можно совершить невозможное.

Огромное спасибо FrenkelS и Retro Ports за их вклад. Ознакомьтесь с их репозиториями, ставьте звезды и, если есть желание, попробуйте свои силы в улучшении кода. История продолжается!
Ссылки
https://github.com/5f9yhmc6cz-spec/doom-ng
https://github.com/FrenkelS/Doom64KB
https://github.com/sabino/DoomGeo


