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

В этот раз речь пойдёт про портирование Another World на Super Nintendo. Узнаем, с какими же проблемами столкнулись разработчики при порте на эту консоль, чтобы выжать заветные 30 fps.

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

Оригинальная статья от Fabien Sanglard.

Серия статей

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]).

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

Архитектура

Все устройства, рассмотренные в прошлых статьях, работали либо на 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 и аудиопроцессор.
Полигоны Another World: Super Nintendo

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

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

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

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

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

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

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

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

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

Режим # Цветов для фона Разрешение (NTSC) Разрешение (PAL) 1 2 3 4 ================================================================================= 0 4 4 4 4 256x224 256x239 1 16 16 4 - 256x224 256x239 2 16 16 - - 256x224 256x239 3 256 16 - - 256x224 256x239 4 256 4 - - 256x224 256x239 5 16 4 - - 512x448 512x478 6 16 - - - 512x448 512x478 7 256 - - - 256x224 256x239 7EXT 256 128 - - 256x224 256x239

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

4BPP SNES TILE LAYOUT: ====================== BYTE BYTE Line 0 bitplane0 Line 0 bitplane1 Line 1 bitplane0 Line 1 bitplane1 . . . . Line 7 bitplane0 Line 7 bitplane1 Line 0 bitplane2 Line 0 bitplane3 Line 1 bitplane2 Line 1 bitplane3 . . . . Line 7 bitplane2 Line 7 bitplane3

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

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

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

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

В Mode 1 мы имеем:

  • 3 бэкграунд слоя.
  • 1 спрайтовый слой.
Полигоны Another World: Super Nintendo

NTSC против PAL

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

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

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

wiki.nesdev.com (Overscan)

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

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

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

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

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

Обратите внимание на уловку 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] и владение японским были бесценными навыками.

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

У меня был параллельный кабель, идущий от Apple IIGS к Sluggo 3, который сам был подключен к Super Nintendo. Я в основном использовала этот девкит, сделанный вручную, т.к. это было проще, чем покупать мне официальный набор для разработки Super Nintendo. Фактически, когда мы изначально разрабатывали что-то для Super Nintendo, мы стали жертвами ксенофобии со стороны Японии.
Когда мы получили разрешение начать разработку программного обеспечения для Super Nintendo, Nintendo предоставила нам свои руководства. Все они были на японском, и они сказали нам, что потребуется от 2 до 6 месяцев для перевода.日本語 を 話 し ま す か?, Вы говорите по-японски? Я да!

Burgertime: Out of This World

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

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

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

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

Консоль настроена в режиме 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].
SNES на самом деле работает на частоте 3,6 МГц. Это довольно быстрый чип для того времени, но ПЗУ, работающие с такой скоростью, стоят немного дороже, чем ромы, работающие на более медленной скорости.
А затем Фарго попросил использовать медленное ПЗУ, т.к. сэкономит 50 центов за картридж.

Burgertime: Out of This World
Полигоны Another World: Super Nintendo

Попытка 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: Super Nintendo

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

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

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

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

Amiga (320 x 200)
Amiga (320 x 200)
Genesis (224 x 176)
Genesis (224 x 176)
SNES (224 x 160)
SNES (224 x 160)

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

Итог

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

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

Burgertime: Out of This World
7777
26 комментариев

Вот, играли люди 200 с чем то на 100 с чем то, и было норм. А вам 4к 60 фпс подавай, зажрались.

13

Теперь можно и спать идти.

11

Я до этого смотрел блог Ребекки и был в шоке когда узнал что она на самом деле трансгендер и в те времена она была пацаном по имени Уилльам. Вот смотрел на нее и в жизни не догадался бы. А так она на мой взгляд заслуженный ветеран индустрии. Ее история с созданием DooM для 3DO и с тем что за этим стояло это конечно сценарий для комедии.

7

Узнал о ней из документалки Netflix. Ее история там органично смотрелась, в отличии от некоторых других представителей меньшинств.

1

А мне для этого понадобилось только прочитать строчку, что перенос игры смогла сделать некая Ребекка, что сразу навело на мысль - видать трансгендер. 

Ее история с созданием DooM для 3DO и с тем что за этим стоялоЕсть стори?