История невозможного порта: Как Quake портировали на Game Boy Advance

Перенести Quake на Game Boy Advance казалось невозможным, но Рэнди Линдену удалось это осуществить. Вот как.

Game Boy Advance — портативная игровая консоль, созданная Nintendo. Он был выпущен в Японии в 2001 году и стал преемником Game Boy Color. Он имел ARM7TDMI с тактовой частотой 16,78 МГц, 32 КБ внутренней рабочей ОЗУ, 256 КБ внешней ОЗУ и 96 КБ видеопамяти. Это не самая мощная машина, но для КПК существует множество игр, которые у многих остаются в памяти. Одной игрой, которая так и не увидела свет для этого устройства, был порт прототипа Quake, игры, разработанной id Software, которая помогла определить жанр шутеров от первого лица, который мы знаем сегодня.

Quake — невероятно детализированная игра с фантастическим саундтреком и захватывающим геймплеем, и, как и DOOM, она портирована практически на все устройства, о которых вы только можете подумать. Его порт на Game Boy Advance особенно невероятен, поскольку он изначально не поддерживает 3D-графику, а Nintendo специально позиционировала этот портативный компьютер как устройство с двухмерным игровым процессом. Однако это не помешало Рэнди Линдену разработать собственный порт.

Фотография порта Quake, воспроизводимого на Analogue Pocket, использована с разрешения Modern Vintage Gamer.

Если вы не знакомы с Линденом, то он наиболее известен как разработчик обоих bleem! (эмулятор PlayStation) и порт DOOM для SNES — достижение, о котором Джон Ромеро, соучредитель id Software, однажды сказал в интервью Шакньюс он не думал, что это возможно. Мастерство Линдена в разработке доказало, что если кто и сможет воплотить Quake на Game Boy Advance в реальность, так это, вероятно, именно он.

Этот порт стал известен благодаря тому, что Линден выпустил его в рамках проекта Forest of Illusion. Forest of Illusion — проект, направленный на сохранение истории игр Nintendo, и Linden обратился к нему с просьбой распространить копию порта Quake, которую он нашел на флэш-карте емкостью 256 МБ в своем владение.

Мы хотели бы поблагодарить Рэнди Линдена за то, что он посвятил время ответам на наши вопросы и обеспечил техническую точность этой статьи. Мы также хотели бы поблагодарить Современный винтажный геймер за разрешение нам использовать любые необходимые кадры из его видео. Этот порт не имеет официального отношения к id Software или ZeniMax и был разработан Линденом как сольный проект.

Порт Quake для Game Boy Advance

С технической точки зрения, это просто чудо, что Quake может даже работать на том же уровне, что и на Game Boy Advance. Он работает с хорошей частотой кадров и поддерживает правильное освещение и цветовую палитру оригинальной игры Quake. Все в 3D, включая оружие и монстров. В играх на Game Boy Advance трехмерная графика обычно достигается за счет спрайтов, но это было по-настоящему. Она не использует приведение лучей так, как это делали другие 3D-игры для портативных устройств, и даже достигает цели. световые эффекты на предварительно обработанных объектах с помощью трюка со сменой палитры для достижения иллюзии динамики осветительные приборы.

Чтобы внести ясность, этот порт не является полной игрой, а представляет собой прототип, который Линден намеревался передать id Software после того, как он будет завершен для подготовки к выпуску. Однако популярность Game Boy Advance пошла на убыль, и вместо этого собственный движок, написанный Линденом, позже стал движком другой игры, полностью разработанной Линденом, — Cyboid. Линден сообщает нам, что «большая часть кода» по-прежнему представляет собой исходный код ARM из версии Game Boy Advance. Если вы хотите опробовать Cyboid, в магазине Google Play доступна более старая версия, но официальный APK-файл теперь распространяется на Магазин приложений Амазон так как в игре много низкоуровневого 32-битного кода.

КибоидРазработчик: Р энд Р Диджитал, ООО.

Цена: Бесплатно.

3.3.

Скачать

Линден также поделился с нами видео своего кода, работающего на iPod Video, который был одной из самых ранних версий Cyboid. Он был построен на том же коде движка, который использовался для его порта Quake на Game Boy Advance.

Порт Quake для Game Boy Advance не содержит никаких официальных ресурсов игры, как и Linden. обратился к id Software или ZeniMax по поводу распространения версии E1M1, содержащей официальный Quake. ресурсы.

Распространяемая сейчас игра также является отладочной сборкой. Удержание клавиши R при загрузке приведет игрока прямо ко второй карте игры, а удерживание левой кнопки D-pad приведет к третьей. Доступ к смене карт также возможен, когда игрок умирает, и монстры не будут атаковать игрока, пока игрок не выстрелит в них первым.

Что касается музыки, в демоверсии используются общедоступные файлы .S3M, а звуковой микшер обрабатывает как стереомузыку, так и звуковые эффекты.

Технические границы

Когда дело дошло до Game Boy Advance, существовал ряд ограничений, из-за которых этот порт был трудным. Одними из самых больших препятствий были низкая тактовая частота, отсутствие возможностей 3D-графики у КПК и отсутствие модуля с плавающей запятой (FPU). На этом пути было много других, но это были особые болевые точки, которые Линден обозначил как проблемные. Прежде чем мы углубимся в это, важно понять структуру Game Boy Advance.

Снимок экрана использован с разрешения Modern Vintage Gamer.

Game Boy Advance имеет три набора оперативной памяти: одна — внутренняя рабочая память (IWRAM), другая — внешняя рабочая память (EWRAM) и третья — видеопамять (VRAM). 32 КБ IWRAM используются для хранения инструкций ARM для быстрого выполнения, тогда как 256 КБ EWRAM оптимальны для хранения инструкций только Thumb и небольших фрагментов данных. Как Родриго Копетти отмечаетДоступ к EWRAM может быть в шесть раз медленнее, чем к IWRAM. Большая часть памяти в виде EWRAM доступна только через 16-битную шину, несмотря на то, что Game Boy Advance продается как 32-битный портативный компьютер. Доступ к IWRAM можно было получить через 32-битную шину. Объем VRAM на Game Boy Advance составляет 96 КБ, и хотя он предназначен в основном для хранения графических данных, он находится в карте памяти ЦП и может использоваться и как обычное хранилище памяти.

Инструкции большого пальца представляют собой подмножество 32-битных инструкций ARM и представляют собой набор инструкций, закодированных в 16-битные слова. Они обладают всеми преимуществами 32-битных инструкций, не занимая при этом много места, что делает их эффективными для оптимизации разработки. Это означает, что, хотя доступ к EWRAM медленнее, инструкции Thumb, будучи эффективными, часто могут работать так же быстро, как хранящиеся инструкции ARM. в IWRAM, хотя недостатком инструкций Thumb является то, что иногда не существует эквивалента Thumb инструкции ARM, которую вы хотите выполнять. EWRAM использовалась для хранения выходных данных логики 3D-математического преобразования, которая, по сути, представляла собой список ребер многоугольника, которые затем отслеживались построчно с помощью кода растеризации.

Как рассказал мне Линден, самой сложной частью всего порта был рендеринг строк развертки. Он состоит из более чем 10 000 строк высокооптимизированного ассемблерного кода ARM, предназначенного для рисования набора пикселей во VRAM. Средство рендеринга строк сканирования использовало большую часть IWRAM объемом 32 КБ. Края, ближайшие к камере, активны и визуализируются, и по сути это большое дерево разделения двоичного пространства (BSP). VRAM использовалась для хранения результатов вывода полигональных преобразований в таблицы ребер, поскольку IWRAM было недостаточно, но VRAM на Game Boy Advance по-прежнему быстрее, чем EWRAM. Графика также хранилась и отображалась здесь.

Он потратил много времени на оптимизацию, чтобы обеспечить максимально быстрое время выполнения. Три вещи, которые он сделал, чтобы ускорить время выполнения, включали следующее:

  • Самостоятельно модифицировал код перед его выполнением, поэтому требовалось меньше инструкций.
  • Использовал ряд справочных таблиц для таких вещей, как обратные величины, синус, косинус, тангенс и т. д.
  • Переключен «режим» ЦП, чтобы получить доступ к дополнительным регистрам (которые похожи на «переменные») без необходимости сохранять и восстанавливать значения регистров.

Переключение режимов ЦП для получения дополнительных регистров — невероятно умный маневр, который обеспечивает быстрый доступ к значениям, близким к ЦП, чтобы их можно было получить за один такт. Как рассказал мне Линден, можно было переключать регистры и получать значение за один такт, в отличие от сохранения значения в оперативной памяти Game Boy Advance, что занимает больше времени. Сам процессор представляет собой процессор с частотой 16,78 МГц, что означает, что он может выполнять 16780000 циклов в секунду. Звучит много, но когда вам нужно вычислить и отрисовать каждый пиксель на экране, они быстро складываются, и становится важно сократить как можно больше операций.

Выше приведен список общих регистров чипсета ARM7TDMI, установленного в Game Boy Advance. Обычно разработчики получают доступ к регистрам только в режиме «Система и пользователь» и прибегают к использованию обычных переменных вне этого режима. Однако он использовал регистры во всех семи режимах работы чипсета, и самое приятное в этом то, что Режимы переключения по-прежнему сохраняют значения в регистрах других режимов, поэтому он может переключаться между их.

Как ни странно, Линден также упомянул, как его метод переключения банков обнаружил ошибку в эмуляторе Nanoboy Advance. Как оказалось, этот эмулятор не поддерживал использование других режимов ЦП для сохранения в регистрах и переключения, а его демо-версия Quake была первой известной игрой, которая действительно это поддерживала.

Линден поделился с нами фотографиями некоторых созданных им заметок и объяснил, как он оптимизировал свои вычисления с плавающей запятой в отсутствие надлежащего FPU.

Изображением выше Линден поделился с нами из своих заметок, и что особенно интересно, так это «разные подсчеты команд цикла ARM». Он разработал способ оптимизации циклов вычислений, чтобы можно было уменьшить количество тактов вычислений. Как он мне описал, 8-битное число можно умножить за один такт, 16-битное число — за два такта, 32-битное число — за три такта, а 64-битное число — за четыре такта. .

«Было две или три стадии исполнения [в процессоре ARM]. Скажем, например, я умножаю регистр один на регистр два и помещаю результат в регистр три. Если бы я знал, что второй регистр — это 16-битное число, вместо того, чтобы умножать первый регистр на второй, я бы перевернул бы его и сказал бы умножить два регистра на первый, потому что это сэкономило бы мне время цикл."

Он сказал мне, что причина, по которой он это сделал, заключалась в том, чтобы выжать максимум производительности из Game Boy. Продвигайтесь вперед, так как сохраненный здесь и там такт действительно суммируется, когда выполняется много вычислений. выполненный. Что касается самомодифицирующегося кода, я попросил Линдена объяснить его.

«Программа поступает из [хранилища], она переносит большой блок программы во внутреннюю оперативную память для выполнения, потому что это быстрее. Каждый доступ к ОЗУ происходит намного медленнее, поэтому я делаю DMA [прямой доступ к памяти] большого блока из ПЗУ в ОЗУ, а затем меняю фактический код программы. Например, ARM имеет возможность сдвигать операнды влево или вправо или маскировать определенные биты как часть набора команд. Инструкция определяет, какие биты вы собираетесь замаскировать или на сколько бит вы собираетесь сдвинуть. Итак, я сгенерировал код, который изменял бы то, что должно было быть выполнено, в зависимости от того, сколько бит мне нужно было сдвинуть. Другой пример касается умножения 3D-матриц. Там задействована целая куча умножений. Я генерировал инструкции, выполняющие умножение, во внутренней оперативной памяти, а затем выполнял их, чтобы код как бы создавал свои части во время работы».

Самомодифицирующийся код имеет свои недостатки, особенно когда дело касается отладки. Это также устраняет необходимость в инструкциях ветвления, где код перейдет к другой последовательности выполнения и может лишить основной поток драгоценного времени вычислений. Линден также сообщил нам, что справочные таблицы в ПЗУ идеально выровнены и являются кратным восьмибитному значению, сдвинутому влево. Размер справочной таблицы огромен и не помещается в ОЗУ, а выравнивание также позволяет избежать необходимости в дополнительной инструкции загрузки для получения базового адреса таблицы.

В целом окончательный прототип разрабатывался почти два года.

Будущее порта Quake Рэнди Линдена

Я спросил Линдена, что будет с будущим порта Quake, и он сказал мне, что ставит рассмотреть вопрос о том, чтобы попросить ZeniMax и id Software выпустить версию с официальным Quake. ресурсы. Он также сказал мне, что в какой-то момент он опубликует исходный код, но в настоящее время он не собирается, поскольку для этого требуется старый компьютер.

Установка Рэнди Линдена для подключения Game Boy Advance к компьютеру для разработки.

Я спросил Линдена, почему он выбрал Quake, и он сказал мне, что ему понравилась игра и что ему нравится, что это «невозможный проект», поскольку он был частью его порта DOOM для SNES. Он также упомянул, что, хотя он не верит, что всю игру можно было портировать из-за нехватки места, подавляющее большинство игры могло быть на одном и том же движке.

Если вы хотите попробовать Quake для Game Boy Advance, обязательно ознакомьтесь с ее выпуском на Forest of Illusion, с которым вы можете ознакомиться ниже.


Скачать с Леса иллюзий