Как исправить игры SNES



Это интервью взято в сентябре 2019 Лукасом Сантьяго у Витора Вилела, бразильского инженера, который исправил Gradius III.

— Здравствуйте, Витор! Для нас честь принимать вас сегодня в рамках 41 конференции Canal3, проходящей в Сан-Паулу. Нам любопытно узнать о вашем патче: как вам удалось сделать Gradius III ещё лучше, устранить все замедления и сделать его более плавным и быстрым. Эта работа очень важна для сообщества любителей ретроигр и заслуживает того, чтобы о ней узнали все.

Для начала расскажите немного о себе. Как вы заинтересовались программированием для такой классической консоли как SNES?

Вилела: Сперва хочу поблагодарить вас за то, что привели меня сюда. Здесь я впервые. Надеюсь это лишь начало. Это здорово — иметь возможность поделиться собственным опытом.

Всё началось, когда мне было 7 лет, и мой отец дал мне SNES. Я был тихим ребёнком, любил оставаться дома, хобби у меня было немного. И я быстро полюбил эту консоль. Начал играть в Super Mario World. По прошествии нескольких лет я стал искать новые игры. Моя семья очень скромная, поэтому достать новые картриджи было не так просто.

Когда мне исполнилось 11 лет у меня появился первый компьютер и доступ в интернет. Мне всегда было интересно, как работают видеоигры, как, например, редактировать уровни Super Mario World. Потом я нашёл редактор под названием Lunar Magic (Лунная магия). Он очень известен в сообществе ромахакинга. Используя его, вы можете редактировать почти всё в игре, каждый предмет. Так я впервые заинтересовался редактированием ROM-образов.
Ромхакинг — процесс модификации ROM-образа игрового картриджа от компьютерной игры с целью изменения игровой графики, текста, уровней и других составляющих. Ромхакингом занимаются опытные, обладающие специальными знаниями, фанаты консольных игр.
Со временем мои интересы расширялись: как работает видеоигра, как работает компьютер?

Так как я уже хорошо понимал, как редактировать Super Mario World и делал это хорошо, приобретённые знания помогли мне развить навыки программирования. Так что я познавал всё сам, просто будучи любопытным ребёнком. Учась в начальной школе, у меня было много свободного времени, благодаря которому я мог находиться за компьютером столько, сколько мне было необходимо. Часто приходилось чинить компьютер, форматировать жёсткий диск и переустанавливать операционку, раз за разом теряя все результаты работ…

Прошло время, я набрался опыта, и к 13 или 14 годам мне удалось собрать много информации о том, как работает SNES. А также получить немного знаний о программировании в целом.

— Видно, что за это время вы многому научились сами. Судя по рассказу ваша страсть пробудила желание узнать больше о программировании. Была ли у вас возможность изучать его в учебном заведении после того, как вы увлеклись SNES? Скажем, в старших классах или колледже?

Вилела: Это правда. После этого этапа я стал интересоваться всем, что касается этой темы: от электроники, когда я был моложе, до программирования, когда я стал подростком. Для меня было легко решиться изучать компьютерную инженерию. По правде говоря, я всё ещё учусь.

— Поговорим немного об игре. Не могли бы вы объяснить нам, как удалось доработать Gradius III? Как вы его модифицировали?

Вилела: Gradius III был очень ранней игрой для SNES. Программисты сосредоточились на создании порта с аркадного автомата. Так как это был порт, они вообще не оптимизировали код. Поскольку игра не была оптимизирована, она работала с низкой частотой кадров в сравнении с аркадной версией. Это пресловутое замедление можно видеть и сейчас, даже в аркадной версии.

Я использовал чип SA-1. Он похож на процессор SNES, только работает в 4 раза быстрее. Базовая частота процессора SNES составляет 2.68Mhz. В то время как SA-1 работает на 10.74Mhz. Мне пришлось открыть код игры, понять, что делает каждая подпрограмма кода, и применить инструменты автоматизации, чтобы вместо стандартной памяти, которая используется для запуска в SNES задействовать оперативную память SA-1.

Чип SA-1 обладает собственной шиной. Таким образом, он может читать и писать подпрограммы кода по своим адресам памяти. После того как вся эта область памяти была перенесена в SA-1, мне удалось направить наиболее ресурсоёмкие части кода в SA-1, вместо более медленного процессора SNES. Таким образом, SA-1 выполняет всю тяжёлую работу, оставляя другие базовые задачи для процессора SNES. Например, он по-прежнему обрабатывает видео и аудио.

В результате вы получаете игру внутренняя логика которой намного быстрее оригинальной. SNES теперь может обрабатывать всё, что необходимо для обновления кадра в пределах лимита, который составляет 16 миллисекунд. В итоге теперь игра работает очень быстро и плавно.

— Сколько она выдаёт FPS 30, 60?

Вилела: 60 FPS!

— Ого, 60 FPS! Это поразительно! Таким образом, вам пришлось переместить область памяти в SA-1, используя её как сопроцессор, чтобы избежать падения частоты кадров?

Вилела: Всё верно. Мне пришлось перенести наиболее ресурсоёмкие части кода на SA-1, который в 4 раза быстрее исходного процессора SNES.

— У SA-1 есть своя память, верно?

Вилела: Верно. SNES может получить доступ к SA-1. Сам SA-1 может получить доступ только к тому, что находится внутри картриджа. Обработка обычного кадра Gradius III занимает от 15 до 100 миллисекунд. Скорость может упасть до 20 FPS. Этого не происходит, когда вы используете SA-1. У вас есть гарантия, что игра будет работать со скоростью 60 FPS.

— Можно ли достичь такого же результата, используя другие чипы SNES, такие как Super-FX?

Вилела: Нет, потому что есть кое-что очень важное. SA-1 и процессор SNES имеют одинаковую внутреннюю архитектуру. Вы можете запустить код SNES на SA-1 с минимальными изменениями. Это было очень важно для создания патча. Мне просто оставалось перенести область памяти из WRAM (память SNES) в память SA-1 (BWRAM), позволяя SA-1 запускать тот же код, который программисты изначально планировали запускать на центральном процессоре SNES.

Основное различие Super-FX в том, что он использует архитектуру RISC. Это кардинально отличает его от процессоров SNES и SA-1, которые используют CISC, основанную на… 65С816. Ту же архитектуру, что использует Apple II.

Самым большим преимуществом в использовании чипа SA-1 была возможность направить наиболее интенсивную для центрального процессора часть кода на более быстрый чип без необходимости изменения кода вообще.

— Super-FX очень известен, поэтому я и спрашиваю о нём. Получается, если бы вы попытались сделать то же самое, используя Super-FX, то из-за различия архитектур вам бы пришлось изменять большую часть кода?

Вилела: Да. Созданный мною патч позволяет запускать один и тот же код на обоих чипах. Код может автоматически переключаться между процессами. Если он работает на процессоре SNES, он переключается на SA-1. Это происходит в обоих направлениях. Например, если это код, который должна выполнять только SNES, такие как обработка видео или аудио, то микросхема SA-1 переключает код на процессор SNES. Когда игра запущена, оба чипа работают параллельно, обмениваясь информацией и оптимизируя процесс. Это возможно только благодаря SA-1.

— Сколько времени вы посвятили исправлению игры?

Vilela: Это довольно сложно измерить. Я могу сказать, что это заняло у меня месяцы, возможно, три или четыре. Иногда я работал три часа в день, иногда двенадцать. Самая большая проблема была не в переносе частей кода в SA-1. Хуже всего было разбирать игру. Это трудоёмкий процесс — разложить, сделать её читабельной, и выяснить, за что отвечает каждая часть.

Довольно сложно чётко понять часть кода, проанализировать её, используя инструменты, и внести жизнеспособные изменения, позволяя SA-1 автоматически переключаться, этот процесс я описал ранее. Невозможно всё это сделать вручную, редактируя игру побайтово. Gradius III весит 512 КБ — это почти миллион байтов для анализа и редактирования вручную.

— Кстати, а почему именно Gradius III? Вы задумывались о том, чтобы пропатчить другие игры, или вы всегда стремились исправить именно Gradius? Вы были знакомы с этой серией, считаете себя фанатом?

Вилела: Как я уже говорил, всё началось с Super Mario World. Для него я внедрил патч SA-1 ещё в 2012 году. Но он не был популярен, потому что использовался для взлома ромов, если только вы не интересовались исправлением проблемы замедления в Super Mario World. Его особенность в том, что вы могли добавлять новые возможности, взламывая ром. Благодаря этому SA-1 стал жизнеспособным. Используя SA-1 вы обретаете дополнительную мощность, которая позволяет добавлять больше врагов, спецэффекты и тому подобное.

Я открыл серию Gradius, когда был моложе. Помню, как играл в аркадную версию Gradius III. Но, знаете, это было так давно, что я забыл об этом. И только потом, когда я проверял список игр, которые мне рекомендовали я увидел в нём Gardius и воскликнул: «О, вау! Я её помню! Мне очень нравится эта игра!»

Попробовав её, я заметил, на сколько медленной она была. Тогда и пришла мысль: если применить патч SA-1 к этой игре — это будет эффектный прирост в скорости. Потому что большинство игр для SNES работают в приемлемых соотношениях скорости и частоты кадров. Но в Gradius III, даже наблюдая за Attract mode, вы замечаете сильные замедления. И эти проседания можно исправить, используя микросхему SA-1.

— В ретроигровом сообществе, особенно в шмап сообществе, есть люди, которые считают тормоза Gradius III неотъемлемой частью игры, поскольку даже в аркадной версии присутствуют замедления. Они считают, что низкая скорость так важна, что при её отсутствии пройти игру будет просто невозможно. Итак, хотелось бы спросить из любопытства, вы проходили игру, после того как её исправили?

Вилела: Нет, не проходил. Это очень сложная игра даже в своём первозданном виде. Я в полной мере понимаю и соглашаюсь с тем, что Gradius III в его замедленном виде это именно то, чего хотели достичь разработчики. Вероятно, они заметили, что SNES не справится со своей задачей. Поэтому они замедлили игру. Извините, наоборот: они ускорили игру в некоторых частях, чтобы компенсировать замедление. Это означает, что благодаря устранению замедлений игра стала более быстрой — стала работать на более высокой скорости, выше, чем планировали разработчики.

Таким образом, мы получили совершенно иной игровой опыт. Просто благодаря тому, что теперь вы можете стрелять с одинаковой скоростью, от начала и до конца. Играбельность это совершенно другое. Игра просто… течёт! И я знаю, несмотря на то, что она стала быстрее, некоторым удалось её пройти. Дойти до конца в аркадном режиме, используя чип SA-1 не составляет труда. Если вас это беспокоит, просто проверьте YouTube — людям это удалось.

— Существует сборник для PS2 под названием «Gradius III and IV». В этой версии Gradius III можно выбрать, с какой скоростью играть: с полным замедлением, с частичным замедлением или вовсе без него. Вы знали об этом?

Вилела: Ну, я узнал об этом уже после выпуска патча SA-1. И для меня это имеет смысл. Если вы привыкли играть в старый добрый Gradius III, а затем решили попробовать его на PS2 и других платформах, то наличие или отсутствие замедления предоставит вам новый опыт. Вы почувствуете, что играете в другой Gradius.

Для меня эта функция, реализованная Konami — совершенно логична. Я считаю это очень умный дизайнерский ход: позволить игроку самому выбрать степень замедления, ведь это влияет и на сложность самой игры. Это может послужить хорошей опцией для патча SA-1. Чтобы игрок мог добавить или убрать фактор замедления.

Так что я не имел понятия об этой версии, когда начал работать над патчем. Мне просто хотелось сделать работу Gradius III быстрой, плавной, с постоянной скоростью в 60 FPS. И я сосредоточился на том, чтобы сделать всё как можно быстрее.

— Ясно. Мне было любопытно, использовали вы PS2, как эталон или просто старались добиться плавности и постоянных 60 FPS. В ходе нашего разговора я понял, что вы хотели добиться 60 FPS и вот результат. Я играл и полюбил её — игра просто потрясающая! Я давний поклонник Gradius III, но пройти его не могу, даже на лёгком уровне сложности. Но в любом случае игра невероятна!

Как вы считаете, можно ли при помощи SA-1 улучшить другие игры для SNES?

Вилела: Конечно! Это та же архитектура. Большая часть библиотеки SNES использует только центральный процессор и ничего более. Все они, безусловно, могут быть «портированы» в SA-1. Одни игры избавятся от замедлений, другие станут работать более плавно.

Возьмём, к примеру, Super Mario World. Как таковых замедлений в ней нет. Но используя чип SA-1, можно быть уверенным, что игра будет работать плавно, поскольку повысится производительность некоторых анимаций. Например, когда вы находите секретный проход или собираетесь сразиться с Боузером — там особый эффект освещения. Многие люди даже не подозревают, но в этих специфичных зонах производительность может упасть до 15 FPS.

— Ах да! Точно! Я заметил это после прочтения статьи о вашем патче в интернете. Люди особо отмечали вашу работу над SA-1 и ромом Super Mario World. Раньше я этого не знал: оказывается, когда вы завершаете раунд или покидаете дом с привидениями картинка как бы увеличивается и сворачивается на вашем персонаже, здесь при помощи Mode 7 получается эффект наподобие концовок в классической мультипликации. В эти моменты производительность сильно падает.

Кто-то сделал сравнение оригинальной игры и вашей пропатченной версии. На нём отчётливо видно величину замедления. Да, это одна из первых, если не первая игра для SNES, но замедление огромно. Мы просто понятия об этом не имели.

Из игр, которые могут быть улучшены при помощи SA-1 наверно получится большой список?

Вилела: Совершенно верно. Проблема только в создании патчей! Просто невозможно пропатчить их все, потому что это займёт очень много времени. Даже используя инструменты для создания ярлыков, это огромная работа.

К примеру, существует инструмент, который позволяет вам, пока вы играете в игру, использовать другую утилиту — она автоматически генерирует часть кода для SA-1. Несмотря на то что это огромная работа, если я буду знать, какие игры являются самыми популярными, и какие из них самые тормознутые, я могу расставить приоритеты по их исправлению.

Конечно, не считая игр, в которых уже используется особый чип, например, Star Fox. Существуют технические ограничения в отношении оборудования SNES. Есть проблема с SNES GPU, я имею в виду, что приставка имеет PPU (блок обработки изображений). Если бы не эти ограничения, то в каждой игре, которая работает медленно из-за её кода может быть использован чип SA-1.

— И напоследок бонусный вопрос от фанатов.

Одним из самых впечатляющих шмапов на SNES является Axelay, также от Konami. Это одна из ранних игр и в ней есть проблемы замедления. Даже в те времена некоторые моменты игры считались ужасными. Некоторые журналы поставили игре низкие оценки именно из-за тормозов. Таким образом, есть люди, которые из-за замедлений считают Axelay красивым, но не играбельным шмапом.

Знаком ли вам Axelay? И можно ли решить его проблемы замедления при помощи SA-1?

Вилела: Axelay мне представили после Gradius III. Я никогда в него не играл и не знал об этой игре. Но посмотрев на геймплей, я абсолютно уверен в том, что игру можно исправить используя SA-1. Если у меня найдётся время, я обязательно это сделаю. Это одна из тех вещей, которые мне бы хотелось осуществить.

— Кто-то может удивиться, но это не всё, чем вы занимаетесь, верно? Я хочу сказать, у вас ведь есть ещё и личная жизнь?

Вилела: Конечно! Я хожу в колледж и работаю на полной ставке. Остальным я занимаюсь в свободное время. Мне очень помогают сторонники, у меня есть страница на Patreon. К примеру, этот чип, это дар, потому что всю работу с SA-1 я проделал на эмуляторах. Чип, который я использую сейчас, был мне подарен поклонником из Канады, и это мне очень помогло.

Теперь я могу просто взять чип, перепрограммировать его, на компьютере, используя EPROM. Потом взять специальный картридж с сокетом — вынуть один чип и вставить другой.

После этой замены, я могу загрузить чип на настоящем железе SNES и проверить, работает ли SA-1 так, как я задумал. Разница SA-1 и других техник решения проблем с замедлением в том, что с SA-1 вы можете играть на настоящем железе, это полноценные ощущения.

Все изменения, которые вы производите, потом можно опробовать в игре на настоящей SNES. Всё запускается на родном железе.

— Это очень важно, потому что эмуляторы не всегда хорошо написаны. При запуске игр они редко предоставляют действительную реализацию цикла за циклом. Недавно вышел новый эмулятор BSNES, который предназначен для идеальной реализации SNES на аппаратном уровне, но для его нормальной работы требуется Pentium IV. Это тяжёлый процесс — воспроизводить каждый кадр, каждый цикл.

Для вашей работы эта способность очень важна. Вы можете кодить и тестировать свою работу на настоящем железе.

Вилела: Точно. Кроме того, на сегодняшний день не существует эмулятора для SNES способного реально и точно воспроизводить SA-1. Работу этого чипа никто не смог до конца понять. О нём нет ничего вразумительного. SNES была изучена вдоль и поперёк, но как таковых знаний о SA-1 нет.

SNES работает на скорости 2.68Mhz или 3.58Mhz. Пока SNES простаивает, SA-1 задействует неиспользуемые ресурсы (ПЗУ и ОЗУ), и выполняет код, только быстрее. Ни один эмулятор не справится с этим идеально. Потому что вам нужно не просто эмулировать SNES цикл за циклом, вам также необходимо одновременно эмулировать и все внутренние микросхемы, а это требует мощного процессора. Не вдаваясь в подробности, технически это как эмулировать SNES на тактовом уровне. Это означает соответствовать NTST, которая составляет 21 Mhz.

BSNES очень известный эмулятор. На самом деле, по словам автора, для эмуляции SA-1 вам понадобится процессор Intel Core i7 с частотой 3 Ггц. Намного мощнее, чем Pentium IV, потому что вы должны выполнять последовательность инструкций.

Невозможно запустить эти процессы параллельно, потому что одни части на компьютере идут медленно, другие быстро и так далее. А на настоящем железе всё работает в идеальной гармонии. Все компоненты остаются синхронизированными всё время.

— Отлично! Было очень приятно видеть вас здесь, словно мы побывали на мастер-классе. Большое спасибо за интервью. Особая благодарность за то, что вы посвятили столько времени и энергии улучшению наших любимых игр, чтобы мы могли насладиться ими в полной мере. Невероятно, что благодаря таким людям, как вы — решившимся сделать это, мы можем так играть в наши старые добрые игры.

Ещё раз большое спасибо!

Вилела: И я вам благодарен. Это честь давать подобное интервью. Я надеюсь в скором времени мы увидим больше игр, исправленных при помощи SA-1, чтобы сообщество стало ещё счастливее. Я постараюсь оставаться на связи. Пожалуйста, не стесняйтесь писать мне в ваших любимых социальных сетях: Twitter, Discord, YouTube. И конечно, на канале Patreon. Я очень активен в сетях. Это моё хобби, это то, чем я занимаюсь в свободное время, это моя страсть с детства. Ещё раз большое спасибо за приглашение.

Оригинальное интервью: ShmupsBR: Entrevista c/ Vitor Vilela

Читайте также под звуки радио:
Интервью 2001 года с Масато Маэгавой, взятого аккурат перед релизом Ikaruga. В нём основатель и руководитель Treasure рассказывает об игре, о месте жанра скролл-шутеров на рынке и его будущих перспективах: Ikaruga — философия шедевра

Разговор с композитором — кудесником операторного синтеза, работавшим в Arsys, а после и в Treasure — Интервью с Тосией Яманакой

Интервью с Хисаёси Огура и музыкальной командой Zuntata впервые опубликованном в книге Darius Odyssey, в 2009 году — Zuntata — музыкальная команда Taito

6 комментариев

avatar
Я не хардкорный технарь, но старался перевести правильно. Если допущены ошибки, не стесняйтесь указать — я исправлю.
avatar
RISK может в бразилии и так пишется, но у нас — RISC
avatar
Это опечатка. Поправил. Спасибо.
avatar
byuu конечно расстроится, узнав, что он так и не смог понять SA-1.

Вообще забавно заявление, что исправлена игра, хотя она просто запущена на более быстром процессоре, да и весь разговор по сути про SA-1. А ведь можно было бы заморочиться и реально оптимизировать код, чтобы игра перестала тормозить без привлечения дополнительного процессора. Во множестве игр на SNES основные тормоза из-за очень своеобразной организации списка спрайтов (биты координат разбросаны). Если писать в лоб, получается множество сдвигов и битовых операций. Помогает держать в памяти список спрайтов в более удобном формате, а блок для OAM формировать один раз в конце кадра развёрнутым циклом. В Gradius не смотрел, но скорее всего эта проблема присутствует и там.
avatar
Прочитал с интересом.
Но вот бы 7/9 под кат спрятать =)
avatar
anadara, я прочёл ваш пост с удовольстием. Но моё удовольствие было бы ещё больше, если бы пост был убран под кат, так как сейчас главная страница оказалась совершенно неоправданно перегружена.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.