Эта статья — перевод главы книги Game Engine Black Book: DOOM, подробного анализа внутреннего устройства одной из самых влиятельных игр id Software. В этой главе рассказывается о сложном процессе портирования DOOM на Super Nintendo и о ключевой роли, которую сыграл в нём разработчик игры Star Fox студии Argonaut Games.
Книга написана автором и программистом Фабьеном Сангларом, а полный её текст теперь можно приобрести в бумажном и цифровом виде.
Super Nintendo Entertainment System была выпущена в Японии в 1990 году, а на следующий год появилась в США и Европе.
Она стала 16-битным потомком 8-битной NES. В Японии Super Fami-Com (FAMIly COMputer) приобрела мгновенный успех, и вся первоначальная партия в 300 тысяч устройств была раскуплена за считанные часы. Ажиотаж был так силён, что правительство попросило Nintendo на будущее выпускать свои консоли по выходным, чтобы избежать волнений.
Для обеспечения высокого качества игр консоли Nintendo создала безжалостную систему контроля. Издатели имели право выпускать всего по пять игр в год. Чтобы это правило действовало, Nintendo оставила право производства картриджей только за собой; издатели были вынуждены покупать их у Nintendo. Чтобы все играли по правилам (а также для защиты игр от копирования), перед запуском игры консоль SNES проверяла наличие чипа CIC. Это был мощный защитный механизм, который удалось взломать только к концу срока жизни SNES.
На протяжении девяти лет жизни консоли была выпущена 721 игра, и среди них были такие хиты, как Super Mario World, Zelda III[The Legend of Zelda: A Link to the Past], Mario Kart, F-Zero, Super Metroid и Donkey Kong Country. За всё время было продано почти 50 миллионов консолей, поэтому SNES считается одной из самых популярных консолей в истории, как с точки зрения объёмов продаж, так и каталога игр.
Технически превосходство SNES заключалось в области 2D-графики. Её 16-битный процессор 65C816 с частотой 3,58 МГц имел 128 кибибайт ОЗУ. Он управлял устройством PPU (Picture Processing Unit) с 64 кибибайтами ОЗУ, которое занималось обработкой больших спрайтов и могло поддерживать до 256 цветов при разрешении 256x240. Звуковая система консоли состояла из мощного сочетания 8-битного процессора Sony SPC700 и 16-битного цифрового процессора обработки сигналов с 64 кибибайтами выделенной ОЗУ.
Несмотря на впечатляющий движок обработки двухмерных спрайтов и в особенности функцию Mode 7, машине не доставало сил для таких вычислительно затратных операций, как 3D-вычисления. Nintendo чётко осознавала, что 3D станет следующим важным этапом развития игр, но у неё не было возможностей для его реализации. Волею судеб решение этой проблемы нашлось у небольшой британской фирмы.
Argonaut Games
В 1982 году Джез Сан в одиночку разрабатывал игры, предназначенные исключительно для компьютеров C64, Atari ST и Amiga. Для продажи своих творений ему нужна была компания. Увидев сходство между своим именем (J.San) и Ясоном (Jason) из мифа об аргонавтах, он назвал её Argonaut Games plc.
Фирма недолго оставалась ансамблем из одного человека. К 1990 году он собрал талантливых людей в лондонском офисе компании, и у него появился интерес к портативной консоли Nintendo Game Boy, выпущенной в 1989 году. Команде удалось совершить два казавшихся почти невозможных подвига: они создали каркасный (wireframe) 3D-движок и взломали защиту CIC, чтобы установить его на Game Boy.
«Логотип Nintendo опускался с верхней части экрана, и когда он достигал середины, загрузчик проверял, находится ли логотип в нужном месте.
Игра запускалась только в том случае, если это слово находилось в нужном месте ПЗУ. Если бы кто-то захотел создать игру без разрешения Nintendo, то им бы пришлось использовать слово Nintendo без лицензирования; поэтому Nintendo могла бы подать иск о незаконном использовании торговой марки. Мы выяснили, что это просто резистор и конденсатор — детали ценой примерно в один цент — и разобрались, как обмануть защиту. Система считывала слово Nintendo дважды — сначала чтобы вывести его на экран в процессе загрузки, во второй раз — чтобы проверить его правильность перед запуском игры с картриджа. И это была фатальная ошибка — в первый раз, когда консоль считывала слово Nintendo, мы заставили её возвращать Argonaut, чтобы оно опускалось сверху экрана. При второй проверке мы подавали на резистор и конденсатор питание так, чтобы в памяти было правильное слово Nintendo, и игра грузилась без малейших проблем» — Джез Сан, из интервью Eurogamer, записанного в 2014 году.
На CES ’90 его демо движка с выставочного стенда Nintendo проделало путь аж до офиса компании в Киото. Тогда Джез об этом ещё не знал, но время он выбрал идеально. Как раз тогда Nintendo работала в Японии над играми для Super Famicom, которые должны были показать в момент выпуска консоли её технологическое превосходство. Super Mario World только зарождалась, зато лётный симулятор Pilotwings был уже немного более сложной игрой.
Для симуляции рельефа в Pilotwings использовался режим Mode 7 устройства PPU (способный выполнять такие аффинные преобразования, как поворот, масштабирование и разрезание изображения на части), а также режим HDMA. Однако сами самолёты всё равно оставались обычными двухмерными отрисованными вручную спрайтами. Это беспокоило продюсера игры Сигэру Миямото, потому что не позволяло плавно поворачивать камеру вокруг самолётов (разбитые на части спрайты были неровными).
В то время Nintendo не любила работать со сторонними компаниями, и уж тем более с иностранцами. Но на этот раз они сделали исключение и пригласили в свой головной офис в Киото Джеза с Диланом Катбертом, работавшего над 3D-движком.
Молодые люди (Джезу было 23 года, Дилану — 18) встретились со всеми вице-президентами Nintendo: Миямото, Гумпэем Ёкои, Такэхиро Изуси, Ясухиро Минагавой и Генио Такеда. Им показали всё: от секретной SNES до секретных Mario и Pilotwings. Затем их спросили, можно ли найти способ отрисовывать самолёты как настоящие полигональные объекты.
«Я сказал им, что это лучшее, чего им удастся добиться, если только они не позволят мне разработать оборудование, чтобы SNES стала лучше в 3D. Как ни удивительно, даже несмотря на то, что раньше я никогда не занимался оборудованием, они сказали „да“ и дали мне на реализацию миллион долларов». — Джез Сан
Джез смело пообещал им «десятикратный» рост производительности, поэтому Nintendo с радостью приняла предложение о разработке специального оборудования для игры. Pilotwings придётся выпустить со спрайтовыми самолётами, чтобы успеть к выходу Super Famicom, но чип, который позже назовут Super FX, будет использован для ещё одного проекта Nintendo.
Он назывался Star Fox.
Star Fox
Согласно договору, Nintendo имела право на все решения по гейм-дизайну, а также финансировала Argonaut Games для производства не только оборудования, но и 3D-движка для игры. Джез-сан незамедлительно начал нанимать известных ему британских специалистов.
Для разработки оборудования он подписал договор с Flare Technology (теми же людьми, которые разрабатывали конструкцию Atari Jaguar). Проект Бена Чиза, Роба Маколея и Джеймса Хейквилла имел кодовое название Mathematical Argonaut Rotation I/O, или MARIO. В результате созданное ими устройство оказалось столь мощным, что в шутку они называли Super NES «всего лишь коробкой для установки нашего чипа». Так как консоль модернизировать было невозможно, чип впаивался в каждый новый игровой картридж, что значительно увеличивало его розничную цену.
«Мы разрабатывали чип Super FX так, как не конструировал оборудование никто до нас — сначала мы создали ПО и собственный набор инструкций для максимальной оптимизации работы ПО. Такого никто не делал! Вместо создания 3D-чипа мы по сути разработали полнофункциональный RISC-микропроцессор, имевший математические функции и функции рендеринга пикселей, а всем остальным занималось ПО. Это был первый в мире видеопроцессор (Graphics Processing Unit), и у нас есть патенты, которые это доказывают» — Джез Сан
Карл Грэм и Пит Уорнс работали над созданием движка в лондонском офисе компании, в то время как Дилан Катберт, Кристер Уомбелл и Джайлс Годдард (а позже и Колин Рид) переехали в офисы Nintendo в Киото и тесно сотрудничали с командой Миямото.
Проект увенчался коммерческим и технологическим успехом. Star Fox была выпущена 21 февраля 1993 года и продалась тиражом в четыре миллиона копий.
Дальнейшая история взаимоотношений между двумя компаниями печальна. Сиквел мегахита Star Fox 2 был завершён «аргонавтами» и готов к релизу в 1996 году, но Nintendo внезапно прервала проект, опасаясь его влияния на выпуск Nintendo 64. Компании Argonaut это не понравилось и отношения с Nintendo испортились. Позже Nintendo переманила к себе Годдарда и Уомбелла. Дилан Катберт тоже мог к ним присоединиться, но ему помешал в этом пункт договора о запрете конкуренции. Он уволился из Argonaut и, устроившись в Sony, приступил к работе над PlayStation.
«Развод» двух компаний завершился, когда Nintendo не позволила Argonaut использовать персонажа Йоши в платформенной игре, которую компания планировала выпустить на PS1. В результате они заменили Йоши крокодилом и назвали игру Croc: Legend of the Gobbos. Позже Nintendo выпустила Mario 64, одна механика которой подозрительно напоминала Croc… и даже около года побеждала с ней на рынке.
Чип MARIO имел простую конструкцию на основе 16-битного RISC-процессора с частотой 10,74 МГц и 512 байтным i-кэшем. У него был собственный набор инструкций, оптимизированный для математических вычислений, и собственный буфер кадров, оптимизированных для размещения пикселей. Его работа заключалась в рендеринге в буфер кадров, данные из которого периодически передавались в ОЗУ SNES с помощью DMA. Он мог рендерить до 76 458 полигонов
в секунду, что обеспечивало Star Fox примерно 15 fps.
Став свидетелями феноменального успеха Star Fox, его технологиями заинтересовались другие студии. Была выпущена новая версия чипа под названием GSU, способная работать с частотой 21,4 МГц. Первое поколение GSU использовалось в четырёх играх: Dirt Racer, Dirt Trax FX, Stunt Race FX и Vortex.
Второе поколение (GSU-2) имело тот же процессор с частотой 21,4 МГц и дополнительные контакты, припаянные к шине для увеличения размера поддерживаемых ПЗУ и буфера кадров. Оно использовалось в трёх играх: DOOM, Super Mario World 2: Yoshi’s Island и Winter Gold.
Если вскрыть картридж DOOM, то можно увидеть все упомянутые выше компоненты:
[1] 16-битный GSU-2, [2] 512-кибибайтный буфер кадров, в который выполнял запись GSU, [3] 2-мебибайтное ПЗУ, в котором хранились код и ресурсы, [4] модуль из шести инверторов и [5] чип CIC для защиты от копирования.
«Десятикратный рост производительности был с моей стороны чистым преувеличением. Мы не знали, возможно ли это на самом деле. Но это позволило нам преувеличить, и в то же время превзойти обещания. Вместо десятикратного роста производительности в 3D мы на самом деле повысили его в 40 раз. В некоторых областях, например в математических 3D-вычислениях, рост был даже стократным. Чип не только мог выполнять 3D-вычисления и работать с векторной графикой, но и обеспечивать поворот и масштабирование спрайтов, а эта функция была чрезвычайно нужна была собственным играм Nintendo, например, Super Mario World 2: Yoshi’s Island». — Джез Сан
Интересный факт: некоторым фанатам удалось собрать все игры (721 наименование) из каталога SNES. Обычно картридж DOOM можно заметить издалека. Только три игры было дозволено выпустить не в стандартном сером корпусе. Две были красными — DOOM и Maximum Carnage, а Killer Instinct был чёрным.
Doom на Super Nintendo
DOOM на SNES появился благодаря гению и решимости одного человека: Рэнди Линдена. Он обожал эту игру и решил портировать её на популярную консоль, чтобы ею могли насладиться больше игроков. У Рэнди не было доступа ни к исходному коду, ни к ресурсам версий игры для PC или консоли. Ему пришлось начинать с нуля.
Для получения ресурсов он мог воспользоваться «неофициальной спецификацией Doom», написанной Мэттью Феллом. В ней подробно описывалась структура файлов .wad. Спрайты, текстуры, музыку, звуковые эффекты и карты Рэнди извлёк из DOOM.WAD. С движком история была совершенно иной.
"DOOM была поистине революционной игрой, и я хотел, чтобы в неё могли сыграть люди без PC. DOOM на SNES был ещё одним из программистских подвигов, которые можно было совершить.
Я начал проект самостоятельно и создав полностью функциональный прототип, показал его демо в Sculptured Software. Группа сотрудников Sculptured помогла мне завершить игру, чтобы её можно было вовремя выпустить к праздникам.
Процесс разработки был сложным по множеству причин, и в первую очередь потому, что в то время ещё не было систем разработки для чипа SuperFX. Прежде чем приступать к самой игре, я написал полный набор инструментов — ассемблер, компоновщик, отладчик.
Аппаратный комплект разработки состоял из хакнутого картриджа Star Fox (потому что в нём был чип SuperFX) и пары модифицированных игровых контроллеров, подключенных к обоим разъёмам SNES и соединённых с параллельным портом Amiga. Для скачивания кода, установки точек останова, исследования памяти при передаче данных между двумя устройствами использовался последовательный протокол.
Мне бы хотелось, чтобы в игре было больше уровней, но, к сожалению, игра занимала самое объёмное из доступных ПЗУ и занимала его почти полностью. Я смутно вспоминаю, что свободно было всего около 16 байт, то есть место больше не оставалось! Тем не менее, мне удалось вместить поддержку Super Scope, мыши и модема XBand! Да, можно было даже играть с кем-нибудь онлайн!" — Рэнди Линден в интервью для Gaming Reinvented
В этой версии примечательно то, как Рэнди приходилось «срезать углы» с учётом возможностей и ограничений движка порта.
На рисунке 6.8 видно, что несмотря всего на 600 кибибайт ОЗУ, сохранился синий пол (хоть и одинакового цвета). Заметьте, что геометрия не изменилась (должно быть, добиться этого оказалось чрезвычайно сложно, ведь у Рэнди не ни DoomED, ни doombsp), а на E1M1 сохранились все ступеньки из оригинала.
Reality engine, как его назвал Рэнди, способен был работать с геометрией карт с PC, но у него, скорее всего, возникали проблемы со скоростью заполнения и сэмплированием текстур, потому что текстуры потолка и пола полностью отсутствуют.
На показанном выше скриншоте видно, что окно на самом деле не отображается во весь экран. Эта проблема касалась не только DOOM — Star Fox, Star Fox 2 и всем играм с Super FX приходилось уменьшать размер рабочей области. Скорее всего это было вызвано ограниченной скоростью передачи SNES, не позволявшей выполнять DMA-передачу для полноэкранного рендеринга.
Из 256x224 пикселей «родного» разрешения консоли удавалось отрисовывать всего 216x176, и только 216x144 использовались для 3D (на 32 строках отрисовывалась панель состояния). Вертикальные линии дублировались, то есть Reality Engine был способен рендерить в разрешении всего 108x144. И даже при таком низком разрешении средняя частота кадров составляла 10 FPS, что было серьёзным достижением. «Низкая» частота кадров не отпугивала игроков от игры в DOOM. По словам Рэнди Линдена, картриджи продавались очень хорошо.
В список функций, пожертвованных ради драгоценного ОЗУ, попало разрешение спрайтов, которое пришлось значительно уменьшить; иногда их даже было сложно разобрать (в противовес оружию игрока, которое рендерилось в более высоком разрешении). Пришлось удалить все позы врагов, за исключением спрайтов, смотрящих на игрока, избавиться от драк монстров друг с другом, распространения звука (монстры пробуждались только при визуальном контакте), вырезать бОльшую часть звуковых эффектов (все монстры звучали, как импы).
Интересный факт: изначально Nintendo запрещала использование крови в играх на SNES. Ко времени выпуска DOOM на сцене появилась процедура определения рейтингов ESRB. Учитывая количество крови и кусков плоти, не удивительно, что DOOM на SNES получил рейтинг M («от 17 лет»).
Полный текст книги «Game Engine Black Book: DOOM» можно приобрести на веб-сайте Фабьена Санглара.