Запуск последней GameCube игры в Dolphin


Любая игра GameCube в Dolphin имеет статус «загружаемая». Кроме одной. Star Wars: The Clone Wars и её сложный способ использования блока управления памятью (MMU) PowerPC до сегодняшнего дня делала её недоступной для игры в Dolphin. Но, в конце концов, эта проблема была решена в Dolphin 5.0-540: эмулятор может, наконец, загрузить каждую GameCube игру из официальной библиотеки!


Запуск Star Wars: The Clone Wars в Dolphin


Так что же делает Star Wars: The Clone Wars такой особенной? Чтобы по-настоящему понять, что происходит, вы должны иметь некоторое представление о том, как процессор PowerPC обрабатывает управление памятью и как Dolphin это эмулирует.


Эмуляция блока управления памятью (Memory Management Unit – MMU)


MMU – часть процессора GameCube

Блок управления памятью, или MMU, отвечает за быстрый доступ игры к данным и коду. Вместо непосредственного доступа к оперативной памяти, игры используют интерфейс виртуальной памяти, которая затем транслируется в физическую память с помощью MMU. Это делается двумя способами: Block Address Translations (BAT) для больших участков памяти или страничные таблицы для маленьких.

Игры получают доступ к виртуальной памяти вместо реальной по нескольким причинам. Во-первых, это дает процессору возможность кэшировать получение доступа, что значительно ускоряет эффективность часто используемых значений. Во-вторых, GameCube имеет всего лишь 24 Мб (и некоторые специализированные области) оперативной памяти при 4 ГБ адресном пространстве, т.е. большинство адресов памяти на самом деле не находятся в RAM! Если игра получит доступ к реальным адресам памяти, она в итоге получит мусор или даже зависнет! При использовании виртуальной памяти MMU может бросить исключение, давая игре возможность справиться с непредвиденной ситуацией или предоставить ценную информацию для разработчиков о том, что пошло не так.

Dolphin способен эмулировать MMU с несколькими степенями точности на основе теорий о том, как игра себя ведет.


Теория 1: Программное обеспечение записывает только в валидные участки памяти

До тех пор, пока игры записывают только в действительную память, Dolphin не имеет много работы. Большинство игр GameCube / Wii используют BAT по-умолчанию, и до тех пор, пока они не пытаются получить доступ к памяти за пределами этого участка, всё, что должен сделать эмулятор - это убедиться, что доступ в конечном итоге запрашивается в допустимое место.


Способ по-умолчанию использует один Block Address Translation (BAT), который транслируется на всю физическую память. Поскольку BAT работают быстрее, чем таблицы страниц, большинство игр просто используют именно этот метод.

Dolphin обрабатывает Block Address Translation (BAT) из виртуальной памяти и переводит адрес в физическую память. С точки зрения непрофессионала, игра просит один адрес памяти, но консоль (и, таким образом, Dolphin) дает ему другую область из реальной памяти.

Есть также несколько других крупных частей отображения памяти, которые мы будем держать вне рамок данной статьи. Одна из них – то, как идет отображение памяти ввода / вывода (MMIO), и которая используется для взаимодействия центрального процессора с различными устройствами, такими как дисковод, карты памяти и т.д. Также можно упомянуть специальный загрузочный сектор, к которому игры не могут получить доступ.

MMU Off как скелет эмуляции MMU может быть достаточен для того, чтобы игра загрузилась. Этот метод просто выделяет игре некоторую память для работы, и предполагает, что игра будет нормально работать. И достаточно удивительно, что большинство игр GameCube и почти все игры Wii используют именно этот способ.

Большинство игр GameCube, которые не удалось запустить таким образом, требуют полной эмуляции MMU, но коварные разработчики эмулятора сумели перехитрить их без каких-либо проблем с производительностью с "MMU SpeedHack".


Теория 2: Программное обеспечение предсказуемо при неправильном использовании памяти

MMU SpeedHack можно охарактеризовать как "MMU Off+", так как она не делает какой-либо серьезной эмуляции MMU. Он отображает больше оперативной памяти, чем GameCube, и это должно заставить игры работать, не заботясь о том, что игры на самом деле пытаются сделать.


Поскольку игры используют эти адреса в качестве дополнительной оперативной памяти, просто отображение их как валидная память работает! Но вам, наверное, интересно, почему эти игры имеют доступ к неправильным участкам памяти, не так ли?

Это потому, что Nintendo предоставила библиотеку, которая позволила играм воспользоваться 16 Мб вспомогательной памяти GameCube в качестве дополнительной оперативной памяти. Поскольку эта вспомогательная память связана с DSP, она чаще используется и упоминается как звуковая RAM, но технически она может быть использована для чего угодно. Поскольку процессор не может обращаться напрямую в адресное пространство вспомогательной памяти из-за отсутствия аппаратных функций, игра при чтении или записи в недопустимый участок памяти вызывает обработчик исключений. Этот обработчик исключений затем использует прямой доступ к памяти (DMA) для перемещения данных из вспомогательной памяти в игровой кэш, выделенный в физической памяти. Затем он устанавливает таблицу страниц, чтобы сказать, что этот ранее неверный адрес памяти теперь указывает на место в кэш-памяти, что позволяет продолжать игру без сбоев!

Так или иначе, этот хак в Dolphin работает для почти всех игр, которые используют вспомогательную RAM. Этот хак настолько же некрасив, насколько эффективен и действенен.


Теория 3: неправильный доступ к памяти непредсказуем

MMU SpeedHack отлично подходит для использования, это действительно работает, когда игра имеет типичные модели поведения использования памяти, которые мы видели много раз и которые были интегрированы в Dolphin. Эти жестко закодированные значения позволяют Dolphin предположить, где игры будут читать данные и убедиться, что доступ к памяти на самом деле допустим. MMU SpeedHack игры настолько стандартизированы, что охватываются очень простыми правилами, но эти правила имеют свои ограничения.

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

До оптимизации JIT и эмуляции MMU Fiora и другими, включение MMU было смертным приговором для скорости эмуляции.

21 известные игры требуют нечто большее, чем просто MMU Speedhack


Обработка проверки памяти (memchecks) происходит медленнее, потому что это наносит вред оптимизации производительности "fastmem". Fastmem отображает адресное пространство GameCube / Wii, а затем маркирует всю сэмулированную недействительную память, выделенную на хост-компьютере. Это позволяет Dolphin использовать обработчик исключений центрального процессора, чтобы сделать всю грязную работу при ловле исключений. Когда происходит исключение, Dolphin должен откатиться от fastmem к slowmem для того, чтобы обработать адрес, и это может быть огромной дилеммой производительности.


Проверки доступа памяти являются основой того, что делает MMU Enable, и это основная причина, почему MMU Enabled игры были настолько медленны в Dolphin. Есть случаи, которые требуют использование интерпретатора, а это не работает с fastmem, и они даже медленнее, чем обычный доступ к памяти на консоли!

Несмотря на частую неудачу, это всегда стоит того, чтобы попробовать fastmem для почти любого доступа; операция loadstore в fastmem занимает всего лишь 2 инструкции, тогда как такой же доступ в slowmem может занять до 1000 инструкций! Потому что мы не знаем, находится ли указатель в действительной памяти или нет, мы просто всегда пробуем использовать fastmem из-за огромной разницы в производительности, которую он дает в случае успеха.

Как было сказано ранее, slowmem фактически стал немного быстрее, что сделало его более применимым для использования. Это в основном из-за перемещения проверок доступа к памяти в Far Code Cache Fiora’ы. За счет оптимизации того, как происходит обработка memchecks, MMU игры получили огромный прирост производительности. Rogue Squadron 3 – яркий пример: игра получила прирост от 4 до почти 45 кадров в секунду!

Как правило, Far Code Cache вместе с другими JIT оптимизациями в среднем дают прирост производительности почти на 100% во всех играх, требующих MMU Enable, даже в Rogue Squadron 3. Вот почему сегодня люди на мощных компьютерах могут, по крайней мере, получить шанс поиграть в MMU игры.


Теория 3.5 - Factor 5 – воплощение зла

Конечно, большинство людей не знают, какой медленной была Star Wars Rogue Squadron 3 до того, как был реализован Far Code Cache, поскольку игра просто не загружалась. По крайней мере, NTSC версия. PAL версия доходила до игрового процесса, и именно оттуда были взяты значения производительности до Far Code Cache.


Даже если вы могли добраться до игрового процесса, все могло пойти плохо, 
если жизненно важные части данных хранились на стыках страниц памяти

Rebel Strike являлась второй из последних NTSC игр, которая не работала по одной причине - у нее был малоприятный MMU трюк, который не был сэмулирован на протяжении более десяти лет. Rogue Squadron 3 может хранить свои данные на всех страницах памяти! Во время долгого чтения или записи данных Rebel Strike может вызвать исключение, в буквальном смысле переходя в процессе от действительного адреса на недопустимый! Dolphin раньше обрабатывал эту ситуацию неправильно.


Теория 4 – Игра сама определяет собственную пригодную память

Теперь мы, наконец, добрались до Star Wars: The Clone Wars. После того, как в Dolphin было проделано много работы для как можно более эффективной работы с BAT и таблицами страниц, эта игра решает заставить Dolphin выкинуться из окна: приветствуем Static BAT.



Что Dolphin делает?

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

MMU SpeedHack / MMU Off - дела идут очень плохо в этой комбинации. Поскольку Dolphin не эмулировал MMU должным образом, он просто позволял процессору независимо от мусора сопоставляться с адресом 0x00000000. Эмуляция игры быстро терпела крах, потому что это было очень глупо решение.

MMU Enabled - предполагая, что вы используете версию эмулятора, которая была разработана до написания этой статьи, игры пойдут немного дальше с MMU Enabled. Dolphin эмулирует исключения и загружает обработчик ошибок, но он просто не способен обработать то, что происходит потом. The Clone Wars отключает BAT во время обработки исключений, чтобы получить более тонкий контроль над управлением памятью. А затем сообщает, что BAT по умолчанию и таблицы страниц не достаточно хороши, и пытается создать свой собственный обработчик исключений. В Dolphin BAT жёстко прописаны в коде. Они не являются динамическими. Так что, когда обработчик исключений возвращает ошибки игре... она быстро выходит из строя. Но, по крайней мере, сам Dolphin все еще работает, так что вы можете закрыть игру и начать играть во что-то другое!

Вам, наверное, интересно, "А почему бы вам не сделать конкретные жёстко прописанные BAT для этой игры?" Ответом на этот вопрос является громкое "НЕТ". Игра изменяет BAT несколько раз во время миссий и мультиплеера, а это означает, что требуется правильная эмуляция BAT.


Что Dolphin должен сделать

Правильная эмуляция BAT означает, что Dolphin должен иметь возможность включать и выключать BAT, основываясь на том, что игра на самом деле делает вместо того, чтобы предполагать, что игра хочет сделать. Проблема с этим состоит в том, что основа эффективной эмуляции MMU в Dolphin зависит от того, что эмулятор знает, где действует виртуальная память, и отказ от этого предположения сломает ядро эмулятора.

Star Wars: The Clone Wars является единственной известной игрой, которая использует четыре зеркальных BAT GameCube и BAT данных для создания своих собственных областей памяти. Для того чтобы эмулировать эту игру, эмуляция MMU в Dolphin должна была бы быть полностью переписана. Все становится сложнее с fastmem, memchecks, и всем, что с ними связано.

В отличие от обработчиков пользовательских исключений из других MMU Enabled игр, обработчик исключений The Clone Wars фактически перестраивает память. Он снимает отображение BAT по умолчанию и устанавливает свои значения несколько раз в течение игры. В то время как все предыдущие графики, показывающие BAT, становились все более и более сложными, а эмуляция - более полной, The Clone Wars на это наплевать!


Эмуляция ВАТ в Dolphin наконец была переписана, что позволило ему справиться с этим наихудшим сценарием. Динамические BAT правильно сэмулированы, что позволяет эмулятору принять то, что игры пытаются сделать с памятью. Огромная часть неизменяемых предположений в рамках эмуляции MMU в Dolphin теперь канула в лету благодаря этому огромному свершению.


Работа с таблицами страниц

Разработчики Dolphin знали, что было необходимо для загрузки Star Wars: The Clone Wars в течение многих лет. В древние времена (эпохи 3.0) существовала ветвь, которая могла даже загрузить Star Wars: The Clone Wars при использовании интерпретатора. Это было неоправданно медленно и повлияло на работу не-MMU игр в эпоху, когда производительность была гораздо важнее точности.

Даже текущая реализация (Dynamic BAT) просидела в качестве запроса в течение более года, и позволяла загрузить Star Wars: The Clone Wars большую часть этого времени. Это так долго лежало в ожидании, что должно было быть перебазировано другим разработчиком!

Причина, по которой эта функция так долго реализовывалась - оно должно было быть сделано без потерь производительности для всего остального. И в этом отношении, реализация magumagu преуспевает с триумфом.


Как вы можете видеть, сохранение Dolphin быстрым имело очень высокий приоритет, несмотря на огромные изменения при переписывании MMU. Не-MMU и MMU SpeedHack игры должны увидеть разницу в производительности менее чем на 1%. Это разительное отличие от прежних планов, которые предполагали падение производительности более чем на 30% в не-MMU играх даже при отключенной эмуляции MMU!

Одним из технических подвигов в реализации динамических BAT является то, что она по-прежнему работает вместе с fastmem несмотря на очевидные сложности при работе с действительной памятью! Один из минусов - MMU игры немного медленнее прямо сейчас. Показательно, что 8% - 15% падения производительности – это не то, что не может быть получено обратно при дальнейших оптимизациях. Мы чувствовали, что придется пожертвовать некоторой потерей производительности в угоду этому мощному импульсу в точности.


Побочные эффекты

Более точная эмуляция MMU означает, что много странных поведений в играх теперь будут эмулироваться немного лучше. Тогда как только одна игра требует динамический BAT, другие игры будут пользоваться преимуществами быстрого доступа к memchecks.

Пользователи любят, когда игры вылетают, не так ли? Существует много Wii игр, которые терпят крах на консоли, когда вы делаете различные непреднамеренные действия. Иногда совершение этих действий будет вызывать вылет игры даже в Dolphin! Более легкий доступ к memchecks означает, что теперь Dolphin может точно имитировать хорошо известные баги в играх без вылета самого эмулятора! Из вопросов, связанных с Super Mario Galaxy и Twilight Princess, вылеты теперь можно эмулировать так же, как они были бы на консоли, без потери производительности!

Известная ошибка в Twilight Princess

Опять же, большинство пользователей не хотят, чтобы их игры вылетали. Rayman Raving Rabbids TV PartyRabbids Party Collection) больше не откажется загружать различные мини-игр. Это может быть связано с небольшими изменениями в обработке кэша, или, скорее всего, ошибками в прежних неизменяемых BAT / таблицах страниц. Учитывая, что никто не имел ни малейшего представления, как решить данные вылеты, они просто исчезли с данными изменениями.

Изменения в эмуляции процессора в целом также заставили еще две игры работать без особых объяснений причин. We Love Golf!, разработанная авторами Mario Golf, вылетала при попытке загрузить урок. Summer Athletics 2009 просто не загружалась и выдавала некоторую отладочную информацию на экране. Хотя ни одна игра была затронута реализацией Dynamic BAT, изменения в процессе создания данного функционала необъяснимым образом исправили обе игры. На основании того, что известно о проблемах, это, вероятно, связано с более широким кругом вопросов относительно кэша команд и данных.

Другим приятным сюрпризом является то, что куча ромхаков должна работать лучше в Dolphin. Mario Kart Wii More Fun ромхаки Wiimm’а будут правильно загружать экран выбора гонки! В некоторой степени, по крайней мере.

Это очень, очень большое везение, что оно вообще работает. Поскольку хак не очищает ICACHE и вместо этого полагается на процессор PowerPC для обработки ICACHE, считалось, что данное поведение невозможно эмулировать на Dolphin без огромного падения производительности. Но теперь Dolphin очищает ICACHE при изменениях BAT. К сожалению, пользователи должны будут вернуться в главное меню между гонками. Если вы хотите, чтобы это было исправлено... не беспокойте нас подобными просьбами. Когда однажды Dolphin, в конечном счете, будет эмулировать работу команд и кэша данных, это повысит требования к эмуляции процессора от 14х! Для хардкорных пользователей и тех, кто ищет точности, это должно быть сэмулировано, но для всех остальных… вам не нужна игра, которая требует точной эмуляции кэша.

Если ромхакеры хотят, чтобы их игры работали в Dolphin, мы, к сожалению, должны попросить их не полагаться на ICACHE / DCache поведение PowerPC. В случае Project M, до финального релиза они должны исправить свои ICACHE / DCache основанные вещи, поэтому игра должна работать в Dolphin должным образом. Но, если вы не хотите, чтобы люди использовали в Dolphin ваши ромхаки, вы знаете, как это сделать - на данный момент.


В заключение

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

Эмуляция MMU в Dolphin в состоянии справиться с любой коммерческой игрой в данный момент. Есть только одна команда, которая могла посягнуть на это: Factor 5, но они никогда не делали какие-нибудь игры на Wii ...

Star Wars: Rogue Leaders на Wii

Оказывается, на самом деле существует Wii версия Rogue Squadron. Разработана Factor 5, и это означает, что игра использует консоль так изощренно, как ни одна игра до этого. Проблема заключается в том, что игра так и не была издана, и мы не можем проверить её в Dolphin. Тем не менее, так как она действительно существует, те, у кого есть эта игра, могут запустить её в Dolphin. Может быть, даже получить вылет, который неизбежно возникнет. Или, если она вдруг загрузится, может быть, один скриншот? Пожалуйста?

Эх, ладно. Мы, по крайней мере, имеем Netflix Channel, разработанный основными разработчиками Factor 5 в своей новой компании. И как вы, наверное, догадались, это приложение не загружается в Dolphin.

Источник: официальный сайт эмулятора. 
+50

Комментарии 5

  1. OilRush от 13 сентября 2016 17:04
    Друзья, если вдруг у кого то каким то чудом есть на руках Wii версия Rogue Squadron, поделитесь пожалуйста!
    Я, как ярый фанат Звездных Войн, буду безумно рад опробовать её на эмуляторе :)
  2. Перевод статьи от pcsx2 будет?
    1. OilRush от 17 сентября 2016 15:00
      Соответствующая новость будет в скором времени.
      1. Спасибо за ответ.
  3. Спасибо за перевод, но явно не хватает редактуры. Некоторые английские фразы переведены кране не свойственным для русского языка образом, особенно ближе к концу текста.
Добавить комментарий

Оставить комментарий