Полигоны Another World: Super Nintendo

В этот раз речь пойдёт про портирование Another World на Super Nintendo.

Узнаем, с какими же проблемами столкнулись разработчики при порте на эту консоль, чтобы выжать заветные 30 fps.

Серия статей

  1. Полигоны Another World.
  2. Полигоны Another World: Amiga 500.
  3. Полигоны Another World: Atari ST.
  4. Полигоны Another World: IBM PC.
  5. Полигоны Another World: Sega Genesis.
  6. Полигоны Another World: Super Nintendo.

Super Nintendo

The Super Fami-Com («FAMIly COMputer») была выпущена в Японии 21 ноября 1990. Первая партия в 300000 устройств была распродана в считанные часы. Продажи проходили настолько безумно, что правительство попросило Nintendo выпускать свои будущие системы по выходным, дабы избежать подобного коллапса.

Потребовался почти год, чтобы переименованная система SNES (Super Nintendo Entertainment System) достигла Северной Америки 9 сентября 1991 года. Шесть месяцев спустя долгожданная консоль наконец добралась и до Европы в апреле 1992 года. В Северной Америке 721[1] игра[2] была опубликована за время жизни консоли, в том числе, несколько критически важных и коммерчески успешных, таких как Super Mario World, Zelda III, Mario Kart, F-Zero, Super Metroid и Donkey Kong Country.

Было продано около 50 миллионов устройств за девять лет (1991–1999), и это одна из самых успешных и популярных консолей всех времён (сразу за Xbox One[3]).

Архитектура

Все устройства, рассмотренные в прошлых статьях, работали либо на Motorola 68000, либо на Intel x86. Название процессора SNES звучит странно, но на самом деле Ricoh 5A22 — это 6502 (MOS Technology 6502) на стероидах.

В списке улучшений ЦП включает 16-битные регистры, 2 блока DMA, а также возможность генерировать прерывания на VBLANK и HBLANK.

Блоки DMA:

  • 24-битная Bus-A, которая контролируется CPU: соединяет картридж, CPU и WRAM.
  • 8-битная B Bus, управляемая S-PPU: соединяет картридж, CPU, WRAM, S-PPU и аудиопроцессор.

Несмотря на 128 Кбайт оперативной памяти, машина кажется намного менее мощной, чем Genesis из-за Ricoh, работающим на частоте 3,58 МГц, и столь же не впечатляющей 8-битной шиной данных. Но это система компенсирует мощными видео (S-PPU) и аудио (S-DSP) чипами.

Видео система

S-PPU (блок обработки изображений) — элемент, отвечающий за видеосистему. На то время это был впечатляющей компонент по работе со спрайтами с глубиной цвета 15 бит на пиксель (32768 цветов).

На самом деле S-PPU состоит из двух чипов[4]:

  • PPU 1 отображает графику (тайлы) и применяет к ним преобразования (вращение и масштабирование).
  • PPU 2 обеспечивает такие эффекты/элементы, как окно, мозаика и затухание поверх визуализированной графики.

Для NTSC доступно два разрешения: нормальное 256×224 и высокое (interlaced 512×448). На PAL консоль может выводить соответственно 256×239 и 512×478, хотя разработчики редко беспокоились об этом и часто использовали разрешение NTSC на PAL мониторах.

Как и в Sega Genesis, всё крутится вокруг концепции слоёв, которые здесь называются «фонами». В зависимости от графического режима доступны различные комбинации цветов и фона.

Фон состоит из тайлов. Для каждого фона расположение тайлов определяется в тайлмепе (Tilemap). Размер тайла обычно составляет 8×8 или 16×16. При этом размер каждого фонового слоя может достигать 1024х1024 пикселей (32х32 тайла). Область в VRAM, где настроены эти слои, называется Tilemap и имеет структуру таблицы (непрерывные значения в памяти).

Каждая запись в тайлмепе содержит следующие атрибуты:

  • Значения вертикального и горизонтального флипа.
  • Приоритет (0 или 1).
  • Ссылка на палитру из CRAM.
  • Ссылка на тайл.

Как пример, кадр из Donkey Kong Country 2: Diddy’s Kong Quest.

В Mode 1 мы имеем:

  • 3 бэкграунд слоя.
  • 1 спрайтовый слой.

NTSC против PAL

Разрешения, задействованные для NTSC (256×224) и PAL (256×239), были выбраны не случайно. Они соответствуют известной «безопасной области[5]», которая гарантированно была видна на экране телевизоров начала 90-х.

Реальные телевизоры показывают около 224 строк сигнала, отсюда обычно указывается разрешение 256×224. Но вертикальное положение может немного отклоняться от центра. Эмуляторы и ЖК-телевизоры высокой чёткости обычно используют строки с 8 по 231, но на некоторых телевизорах можно увидеть строки с 12 по 235.

— wiki.nesdev.com (Overscan)

В последней статье о Sega Genesis был пример PAL версии «Sonic, the Hedgehog».

Sonic, the Hedgehog, NTSC

Sonic, the Hedgehog, NTSC

Sonic, the Hedgehog, PAL

Sonic, the Hedgehog, PAL

Nintendo не допустила тех же ошибок со своим звёздным тайтлом «Super Mario World».

В то время как большинство разработчиков использовали разрешение 256×224, которое хорошо смотрелось на телевизорах в Северной Америке и Японии, но приводило к чёрным вертикальным рамкам на телевизорах PAL, Nintendo постаралась использовать 256×239 и реорганизовать тайловые карты. Они также учли частоту обновления 60 Гц/50 Гц и заставили всё двигаться со скоростью 16мс/20 мс, соответственно, чтобы не замедлять игровой процесс на PAL[6].

Super Mario World, NTSC

Super Mario World, NTSC

Super Mario World, PAL

Super Mario World, PAL

Обратите внимание на уловку Nintendo с PAL, чтобы заполнить две лишние линии тайлов внизу. Границы и расположение текста были соответственно скорректированы. Имейте в виду, что телевизоры PAL и NTSC имели соотношение сторон 4: 3. После вывода на экран эта тайловая карта выглядела растянутой по горизонтали.

Another World на Super Nintendo

Another World была портирована на Super Nintendo Ребеккой Хейнеман примерно в 1992 году для Interplay. Она не смогла ответить на вопросы до публикации этой статьи. Информация была собрана из видео «Burgertime: Out of This World» и эмулятора bsnes-plus, чтобы заглянуть под капот.

Мы хотели делать игры для Super Nintendo, и Out of This World действительно была той игрой, которую нам хотелось бы создать. Насмотря на то, что Super Nintendo была мощной, это, всё же, не Amiga. У нас не было возможности сделать OotW на SNES, это просто невозможно.

Что ж, любой, кто следил за моей карьерой, знает, что «это невозможно» обычно приводит к «вызов принят». И вызов действительно был принят.

— Burgertime: Out of This World

Порт производился на ускоренном Apple 2GS (который использует тот же 65C816, что и SNES), подключенном к SNES через эмулятор Sluggo 3 ROM, который Ребекка создала сама.

Я взяла исходный код, посмотрела на него и поняла, […] всё, что мне действительно нужно было […], — это создать интерпретатор, который запускал бы язык сценариев и чертовски оптимизировал сам интерпретатор, чтобы тот смог запустить игру.

На это у меня ушло около двух-трёх недель, и я сидела и ничего не делала, кроме как переводила строчку за строчкой […].

Я смотрела на функцию 68k, выясняла, что она действительно должна была делать, и писала эквивалент на 65C816. Я делала это для каждой отдельной функции, пока в конце концов не перенесла их всех. Игра работала только с фреймрейтом 10 кадров в секунду, потому что я не делала никаких реальных оптимизаций.

— Burgertime: Out of This World

Это были интересные времена. В то время знание оборудования для развёртывания собственного девкита Sluggo 3[7] и владение японским были бесценными навыками.

У меня был параллельный кабель, идущий от Apple IIGS к Sluggo 3, который сам был подключен к Super Nintendo. Я в основном использовала этот девкит, сделанный вручную, т.к. это было проще, чем покупать мне официальный набор для разработки Super Nintendo. Фактически, когда мы изначально разрабатывали что-то для Super Nintendo, мы стали жертвами ксенофобии со стороны Японии.

Когда мы получили разрешение начать разработку программного обеспечения для Super Nintendo, Nintendo предоставила нам свои руководства. Все они были на японском, и они сказали нам, что потребуется от 2 до 6 месяцев для перевода.

日本語 を 話 し ま す か?[8], Вы говорите по-японски? Я да!

— Burgertime: Out of This World

Дизайн в целом

ЦП рендерит в три локальных фреймбуфера, расположенных в ОЗУ. Когда кадр завершён, он копируется DMA[9] в VRAM. Чтобы избежать тиринга, в VRAM используется двойной буфер.

Консоль настроена в режиме 1, который имеет три фона, но всё происходит в фоне 1. Каждый раз, когда доступен новый кадр, обновляется тайловая карта соответствующего двойного буфера. Фреймбуферы подделываются с помощью уникальных тайлов 8×8.

Благодаря планарному расположению тайлов эта версия могла отображать как Atari ST с сегментами по 8 пикселей, записанным за 4 операции.

Значительное замедление было из-за байт-кода, который был разработан с учётом 16-битных регистров. Ricoh имеет 16-битные регистры, но его 8-битная шина данных делает операции сохранения/загрузки вдвое медленнее. Даже с DMA проталкивание всех этих байтов из RAM в VRAM было проблемой. А реализовать код операции COPY было ещё сложнее.

Решением как проблем с процессором, так и пропускной способностью было использование только 28×20 из доступных тайлов 32×28. Это снизило разрешение с 256×224 до 224×160.

Дополнительные чипы

Возможно, самая интересная часть порта — его итерационный процесс[10].

SNES была основана на двух мощных микросхемах, S-PPU и S-DSP, со скромным управляющим процессором. Чтобы удовлетворить другие потребности разработчиков, Nintendo тщательно спроектировала порт для картриджа. В адресном пространстве Bus-A (к которому подключён картридж) имеется зарезервированная секция (6000–7FFF)[11]. Порт картриджа также имеет специальную линию шины (/CART), которая позволяет ЦП сигнализировать, когда он обращается к адресному пространству картриджа.

Сочетание этих двух фич позволило разработчикам выпускать карты (также известные как Game Pak) со специальными чипами на борту. Эти «усовершенствованные» следят за bus-A и используют зарезервированное пространство памяти для сопоставления своих регистров с целью получения команд от ЦП.

Эту функцию Ребекка попыталась использовать в первой итерации.

Попытка 1: чип Super-FX

Я думала, что смогу запустить эту игру в 60 fps, вставив туда чип Super FX. Получив копию Starfox я вытащила чип, выяснила, как он работает, и начала его использовать. OotW работала со скоростью 60 кадров в секунду! Я сказал: «Эй, Брайан, игра почти готова, вот картридж, который мне понадобится».

Посмотрев на цену, он спросил, можно ли избавиться от чипа Super FX?

— Burgertime: Out of This World

Попытка 2: статическая RAM

Я вытащила весь код Super FX, а затем заменила его программным рендерингом. Но были определённые части программного рендеринга, которые выполнялись очень медленно. К примеру, когда мне надо было полностью скопировать фон с экрана в другой. Если бы у меня была статическая память [WRAM] на картридже, я действительно могла бы скопировать эту статическую память очень быстро, используя DMA. Поэтому я попросила картридж, который использует статическую память, с которой я смогла бы запустить игру в 30 fps.

Но это всё ещё было дорого.

— Burgertime: Out of This World

Попытка 3: быстрый картридж (3.58Mhz)

Без поддержки ОЗУ с резервным питанием от батареи нам придётся использовать коды для сохранения. Когда вы доходите до определённого уровня, вам показывают код […] вы записываете его на лист бумаги и таким образом сохраняете свои игры.

И так, у нас нет чипа Super FX, нет оперативной памяти с резервным питанием. Я смогла бы снова заставить игру работать со скоростью около 30 кадров в секунду, если бы у меня был быстрый картридж. В то время вы могли купить либо 2,68 МГц [SlowROM], либо 3,58 МГц [FastROM[12]].

SNES на самом деле работает на частоте 3,6 МГц. Это довольно быстрый чип для того времени, но ПЗУ, работающие с такой скоростью, стоят немного дороже, чем ромы, работающие на более медленной скорости.

А затем Фарго попросил использовать медленное ПЗУ, т.к. сэкономит 50 центов за картридж.

— Burgertime: Out of This World

Попытка 4: медленный кртридж (2.68 Mhz)

Вынужденная использовать slowROM, я обнаружила, что игра будет работать со скоростью 20 кадров в секунду. Я пробовал различные трюки, чтобы заставить игру работать быстрее.

Как, чёрт возьми, заставить эту штуку работать быстрее? Затем меня осенило, что я не использую регистры DMA. Внимательно прочитав технические характеристики на японском, я пришла к выводу, что эти регистры памяти фактически работают на полной частоте процессора 3,6 МГц.

Аппаратные регистры — это, по сути, значения, которые вы можете просто записывать и читать. Было около 32 байтов памяти, используемых в качестве регистров.

Я поместила туда 32-байтовую функцию для отрисовки строки развёртки полигональных данных. Скорость увеличилась на 10%.

— Burgertime: Out of This World

Подробнее про PAL/NTSC и соотношение сторон

При ограниченном временни на разработку Another World на PAL не получила плюшек от особого горизонтального преобразования. Версия игры для PAL поставляется с тем же разрешением тайлов, что и версия для NTSC.

Another World, NTSC

Another World, NTSC

Another World, PAL

Another World, PAL

Принимая во внимание соотношение сторон 4:3 преобразования тайловой карты в разрешение ТВ, мы видим, что версия для PAL имеет соотношение сторон 1,74, а NTSC — 1,6299. Оба очень близки к предполагаемому коэффициенту 1,666.

Another World, NTSC

Another World, NTSC

Another World, PAL

Another World, PAL

Цвета и разрешение

По сравнению с Genesis и Amiga, у SNES было более низкое разрешение, но результат всё равно выглядит впечатляюще хорошим.


Благодаря 15-битной глубине цвета, оные на SNES являются точным преобразованием 12-битных цветов Amiga. Выражение лица Лестера не было изменено, что может означать, что порт на Genesis был выполнен после SNES.

Итог

Со слов самой Ребекки всё завершилось вполне удачно.

У меня есть распечатка обложки «Out Of This World». Она подписана Эриком Шайи с примечанием: «Поздравляем с завершением разработки и релизом версии для Super Nintendo». Он дал мне этот постер уже в рамке […], а я отреагировала на это: «Боже мой, спасибо тебе большое». С тех пор она висит у меня на стене.

— Burgertime: Out of This World

Ссылки

  1. 721 в Северной Америке, 517 в Европе, 1448 в Японии, 231 на Satellaview и 13 на Sufami Turbo, всего 1757 наименований.
  2. Wikipedia, список SNES игр.
  3. Список самых продаваемых консолей.
  4. SNES Schematics, Ports, and Pinouts.
  5. Overscan.
  6. Super Mario World Wiki: Version Differences.
  7. Apple II RoundTable: Sluggo III.
  8. «Nihongo wo hanashimasuka?» означает ‘Вы говорите по-японски?’.
  9. BSnes Plus Debugger.
  10. Burgertime 8/9/2015: Out of This World.
  11. Enhancement chips memory.
  12. SNO SNES SlowROM vs FastROM.