Примерно месяц назад мы сняли видео [а на Хабре опубликовали его перевод] о сложности реализации игры наподобие Doom на консоли Neo Geo. Причина заключается в том, что у Neo Geo нет концепции буфера кадров, то есть всё, что мы видим на экране Neo Geo, рендерится, как спрайт. Также в этом видео я рассуждал о концепции движка рейкастинга, который вполне неплохо работал на Neo Geo. Придуманная мной концепция, по сути, заключалась в создании плоской сетки блоков и испускании одного луча на каждый вертикальный столбец. Разработчик Sabino даже предпринял любопытную попытку создать на этом движке игру в стиле Doom.

Но, разумеется, рейкастер и движок уровня Doom — это далеко не одно и то же. Рейкастер может работать только с сеткой, то есть с квадратными блоками, а значит, все объекты на карте должны иметь одинаковую высоту, а стены находиться под прямыми углами. Doom же устроен сложнее: в нём есть стены, располагающиеся под любыми углами, помещения с разной высотой полов, лестницы, лифты и двери. Ничто подобное невозможно реализовать в простой игре с рейкастингом. Даже в проекте Sabino поворот за угол выглядит не особо естественно. В конечном итоге, мы имеем дело с сеткой из квадратных блоков, поэтому в таком движке с рейкастингом невозможно реализовать что-то наподобие уровня E1M1, The Hangar.

Однако у этой саги «Doom на Neo Geo» недавно появилось несколько продолжений, и я в восторге от того, куда всё это может привести. Как я упоминал в последующем видео, люди действительно серьёзно принялись за решение этой задачи. У нас появились новые подходы к реализации Doom на Neo Geo.

Первый подход заключается в портировании Doom 64 KB. Это решение придумал разработчик FrenkelS, создавший порт Doom 64 KB. Любопытно в нём то, что это действительно Doom. Это реальное BSP, реальная геометрия карты. Это E1M1 без каких-либо модификаций: по сути, разработчик взял настоящий код рендеринга Doom и ужал его настолько, чтобы он помещался в Neo Geo.

Но как всё это работает? Мы ведь говорили, что у Neo Geo нет буфера кадров, так как же настоящий Doom, созданный на основе записи пикселей в буфер кадров, работает на машине без буфера кадров? У Neo Geo есть текстовый слой (fix layer). Обычно он используется для хранения, например, отображаемых очков или элементов интерфейса. FrenkelS использовал этот слой в качестве крошечного буфера кадров. Именно об этом мне писали в комментариях под первым видео: fix layer потенциально можно использовать для создания рендерера.

Как видите, E1M1 работает, хоть и в квадратиках 38 на 28. Тем не менее, игра совершенно не модифицирована. Это Doom во всём его величии. Производительность явно не оптимизирована, но он работает! Интересный способ решения задачи запуска Doom на Neo Geo, и он работает!

Но на этом история не заканчивается. В ней есть и ещё одно интересное развитие. Sabino, работавший над NG Raycaster, о котором мы уже говорили, разработал так называемый «спрайтовый микробуфер кадров» (sprite micro-frame-buffer). Концепция его заключается в том, чтобы вместо текстового слоя создавать буфер кадров из спрайтов. Мы берём функцию масштабирования спрайтов Neo Geo (тот же аппаратный блок масштабирования, который применялся в рейкастере) и уменьшаем всё до крошечных блоков 4 на 4. А затем заполняем весь экран этими маленькими блоками.

Каждый из этих блоков размером 4 на 4 — это один пиксель, то есть теперь мы можем рендерить Doom в разрешении 80 на 56, что в два с лишним раза больше, чем в предыдущем решении. Внезапно картинка становится более чёткой и похожей на Doom, мозаичность снижается, но за это приходится расплачиваться сильным падением производительности. Я скомпилировал проект сам, применил патч Sabino, и всё заработало. Это очень любопытное решение, ведь у него, вероятно, есть потенциал оптимизации.

Также стоит сказать, что консоль Neo Geo AES+ (современная реплика Neo Geo), которую выпустят в этом году, будет иметь функции разгона. То есть спрайтовый микробуфер кадров Sabino сможет вполне прилично работать хотя бы на железе AES+.

Есть и второй порт, за которым я слежу. Его выпустил некто под ником Retro Ports. Этот порт называется Doom-NG. В нём применён интересный подход: как видите, в нём тоже используется оборудование для работы со спрайтами. Можно чётко видеть вертикальные полосы. Если вернуться к рейкастеру, который я написал в первом видео, то причиной его довольно высокой скорости было то, что CPU использовался только для расчёта видимости. Это значит, что если использовать его только для расчёта дальности видимости и расстояния до объектов, то всё остальное может обрабатывать аппаратный блок масштабирования спрайтов.

Разумеется, плохо в таком подходе то, о чём мы говорили выше: можно использовать только сетку, без реальных карт Doom. Для Doom-NG был разработан новый рендерер под названием VSlice. Он позаимствовал всё хорошее от рейкастинга и избавился от всего плохого. Аппаратный блок масштабирования по-прежнему отрисовывает все пиксели, поэтому, как в рейкастере, буфера кадров и работы CPU с пикселями нет. Но вместо испускания лучей по сетке для определения видимого он обходит настоящее BSP-дерево Doom.

Если вкратце, BSP-дерево — это структура данных, создающая карту за разработчика. Она обрабатывает всё, от произвольных углов и секторов на разных высотах до перекрытия одних объектов другими — всё то, с чем не может справляться рейкастер. CPU обходит реальную геометрию Doom спереди назад и определяет, какие части стены может видеть игрок, а какие нет.

Рендерер VSlice берёт реальную геометрию карты Doom и позволяет свободно двигаться по ней. Все девять оригинальных карт Episode One работают на немодифицированном оборудовании Neo Geo. Хотя видно, что по экрану движутся полосы спрайтов, это именно Doom во всём его великолепии.

Разумеется, это не попиксельно точный Doom, и разработчик на это не претендует. Как видите, ему пришлось пойти на компромиссы, но они реализованы довольно умно. Полы и потолки не отрисовываются, это заранее подготовленные таблицы поиска. Изображение вдали затуманено, чтобы скрыть потерю деталей. Текстурирование по вертикали выполняется блоками по 16 пикселей, а частота кадров, как можно заметить, непостоянная. Движок проверяет, что находится на экране, и если перед игроком большое открытое пространство, которое замедляет расчёты, он снижает расстояние отрисовки, скрывая всё остальное в тумане. Конечно же, пока это лишь доказательство работоспособности концепции. Это движок, созданный на основе продуманных оптимизаций, настраиваемых самим разработчиком. Но ощущение той самой игры присутствует; когда всю работу выполняет оборудование, это начинает походить на настоящий уровень Doom.

Конечно, оба этих решения далеки от идеала. В обоих есть различные компромиссы и ограничения. У нас есть спрайтовый микробуфер кадров Doom 64 KB, который представляет собой реальный Doom с реальным рендерером. Он решает задачу грубой силой, но это работает. Он создаёт картинку, обеспечивая имитацию буфера кадров из спрайтов, но за это приходится расплачиваться скоростью.

И ещё у нас есть рендерер VSlice авторства Retro Ports: реальная геометрия Doom, но отрисовываемая так, как это хочет делать Neo Geo: при помощи масштабируемых спрайтов. Рендереру вообще не требуется буфер кадров, и из-за этого я думаю, что мы начинаем приближаться к окончательному решению задачи. Оба этих подхода имеют очень интересные сценарии использования, и я не могу отдать предпочтение какому-то одному.

Для меня это два проекта, представляющие собой первые серьёзные попытки запуска Doom: один из них засовывает реальный рендерер в оборудование, хочет оно того или нет, а второй пользуется мощью аппаратного масштабирования спрайтов. Разумеется, ни один из проектов ещё не завершён и ни один из них ещё не выйдет скоро в виде старшей версии. Их смысл в том, что, как мы сказали, Neo Geo не предназначалась для запуска Doom, однако благодаря талантливым людям это становится возможно.

Выражаю большую благодарность FrenkelS за Doom 64 KB и за все усилия по рендерингу в 64 КБ, а также Retro Ports за рендерер VSlice Doom-NG. Ссылки на них будут приведены ниже. Ставьте звёзды их репозиториям и посмотрите, сможете ли вы добавить какие-то интересные патчи. Это очень любопытная история, и я продолжу её освещать.

Ссылки

https://github.com/5f9yhmc6cz-spec/doom-ng

https://github.com/FrenkelS/Doom64KB

https://github.com/sabino/DoomGeo

https://github.com/lantus/NGRayEx

Комментарии (0)