Dolphin, сентябрь 2014: оптимизация, оптимизация и еще раз оптимизация

Миновал первый осенний месяц. Для эмулятора Dolphin он оказался не менее благоприятным, чем предыдущий. За последние полгода разработчики сделали больше, чем, наверное, за два предыдущих года. Сказать, что эмулятор развивается семимильными шагами – ничего не сказать. В очередном материале на сайте Dolphin описывается проделанная работа. Ниже я привожу список важнейших исправлений за предыдущий месяц, но отдельно надо отметить разработчиков Fiora и comex, которые в очередной раз поработали над оптимизацией эмулятора (к слову, в прошлый месяц мы получили 26% прибавку к производительности). Благодаря всего двум изменениям от comex, скорость эмуляции выросла на 16%. Но это еще не все. Fiora как обычно внесла огромное количество изменений, на перечисление которых у нас не хватит места. Поэтому она опубликовала суммарные данные по увеличению скорости, достигнутые благодаря ее изменениям за последние два месяца:
  • Бенчмарк Dolphin: работает на 62% быстрее;
  • Sonic Colors: на 39% быстрее;
  • Star Wars Rogue Squadron II: Rogue Leader: на 103% быстрее (иными словами, в два раза!);
  • F-Zero GX: быстрее на 110% быстрее (иными словами, в два раза!);
  • The Last Story: быстрее на 38%;
  • Xenoblade Chronicles: быстрее на 40%;
Отдельно стоит отметить игру The Last Story – это самая требовательная игра на эмуляторе: даже самым мощным процессорам требуется значительный разгон, чтобы запустить ее на приличной скорости. Теперь, благодаря увеличению эмуляции на 38%, The Last Story может эмулироваться на мощных компьютерах в полную скорость. А благодаря оптимизации MMU, игры, использующие эту функцию приставки, теперь работают гораздо быстрей, как, в частности, Star Wars Rogue Squadron II: Rogue Leader (подробности – ниже).

А теперь список важных изменений:

Изменение точек закольцовывания аудио

Эмуляция звуковой части приставки – дело не легкое. Даже с учетом нового AX-HLE (и даже DSP LLE), многие баги остаются неисправленными. Skidau обнаружил баг в эмуляции точки закольцовывания аудио, который вызывал целый ряд проблем со звуком.
 
 до:                                                                    после:
           

В результате были исправлены следующие проблемы:
  • Рассинхронизация и неправильная работа звука в видеороликах (FMV), затрагивала игры Mega Man X Collection и Pac-man World 2;
  • Неправильное звучание инструментов, затрагивало игры Skies of Arcadia Legends, Tales of Symphonia и Pokemon Colosseum;
  • Полная рассинхронизация звука в играх серии Taiko no Tatsujin и Rhythm Heaven Fever;
Как говорится, скатертью по попе, дорогие глюкобаги, мы не будем скучать по вам!

Отключение логов для исправления тормозов

Обычно протоколирование (logging) не вызывает тормозов, и поэтому разработчики на первых порах не обращали внимания на жалобы некоторых пользователей: вполне возможно, что проблема крылась в компьютерах этих пользователей. Но пользователи оказались не из робкого десятка и решили сами найти проблему. В итоге виновником оказалось протоколирование: оно каким-то образом тормозило игры, активно стримящие звук.

Разработчики проверили информацию – и действительно, опция ведения логов в FileMonitor неведомым образом влияла на производительность в некоторых играх. Особенно это было заметно в игре 1080 Avalanche: несмотря на мощность процессора, она всегда ограничивалась 40 к/с.

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

Обновление OpenAL-Soft до версии 1.16.0

Звуковой режим OpenAL примечателен тем, что только он поддерживает функцию time-stretching во время снижения скорости. Однако в нем был высокий уровень задержки звука, и поэтому мало кто им пользовался.

Благодаря обновлению OpenAL-Soft, выполненного skidau, задержка значительно уменьшилась. Теперь начиная с версии 4.0-2948, этот режим, в плане задержки, вплотную приблизился к Xaudio2. Если у вас часто проседает скорость эмуляции, есть смысл попробовать этот аудиорежим.

Изменение проверки Loopback в HLE

Играя в Mario Kart Wii, игроки пропускают вступления: они лишь занимают время, поэтому все просто жмут кнопку пропуска. Но в DSP HLE присутствовал баг, из-за которого эмулятор во вступительных роликах режима battle mode вылетал. Поскольку все игроки эти ролики пропускали, данный баг оставался незамеченным на протяжении тысяч ревизий!
 

Skidau обнаружил источник проблемы и внес необходимые изменения.

Режим регистров PowerPC

В оригинале приводится описание функционирования регистров и внесенных изменений, которое понятно лишь программистам. Нам же, низшим созданиям простым пользователям, достаточно знать, что изменение в их работе дает прирост производительности в 8%.

Подключение эмулируемого звука из виимоута

В эмуляторе Dolphin звук из динамика виимоута не эмулируется из-за ограничений Bluetooth, да и на самой приставке Wii он тоже далек от идеала. Долгие годы в воздухе витала идея перенаправления эмулируемого звука виимоута на общие колонки. Ее можно было бы реализовать, но у Dolphin отсутствовал аудиомикшер… до последнего времени.

Благодаря объединению ветки Synchronous DTK Audio, в эмуляторе появился микшер, чем и воспользовался skidau, добавив перенаправление звука из эмулируемых виимоутов на общий звуковой канал компьютера. Благодаря устранению ограничений Bluetooth и появлению полноценных динамиков, некоторые звуковые эффекты стали звучать очень даже неплохо.

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


Начало поддержки AArch64 JIT

Учитывая, что на данный момент на рынке не представлены андроид-устройства на базе 64-битных процессоров ARM, это изменение может показаться преждевременным. Но ведь и появление Dolphin на мобильных телефонах тоже было преждевременным! Sonicadvance1 думает наперед, и поэтому он начал работу по добавлению еще одного режима JIT в процессоры с архитектурой AArch64, в том числе и Tegra K1 Denver. Благодаря ним скорость эмуляции должна вырасти в разы.

Увеличение скорости эмуляции MMU

Игры, использующие Memory Mapping Unit (MMU) всегда страдали от низкой производительности. Почему? Потому что игры использовали очень сложно эмулируемые функции, в частности обработку исключительных ситуаций и виртуальную память. В самом лучшем случае, игры с MMU работали должным образом, без вылетов, но с посредственной скоростью. В худшем – они вообще не запускались.

И хоть у MMU полно других проблем, Fiora решила разузнать, возможно ли увеличение скорости эмуляции игр, задействующих MMU. Fiora, как обычно, начала работу с добавления поддержки JIT некоторым инструкциям, переключавшимся в режим интерпретатора, тем самым улучшив их точность. Во время профилирования на нее снизошло озарение: низкая скорость в играх, использующих MMU, вызвана не работой MMU.

В результате эмуляции MMU, JIT вынужден генерировать огромное количество дополнительного кода. Количество этого кода настолько огромное, что оно запросто вызывает переполнение кэша процессора, в результате чего ЦП огромное время простаивает в ожидании выполнения кода.

Fiora решила убрать большую часть этого кода в отдельный кэш «FarCode», и сделала так, чтобы процессор обращался к нему только строго по необходимости. Но не тут то было: MMU игры не любят, когда над ними начинают проводить изменения. Поэтому каждое ее изменение приходилось тщательно проверяться на предмет багов: MMU настолько суров, что не терпит даже и малейшей ошибки. После долгого тестирования все стало работать как надо. Так стоили ли ее усилия выделки?
 

Это не самое страшное, что произошло с супергероем с нашей подачи: Человек-паук стал всего лишь летающей фанерой, а вот Бетмен однажды превратился в летающую мошонку.

Игра Star Wars Rogue Squadron II: Rogue Leader начала эмулироваться в два раза быстрее, чем раньше, а другие MMU игры стали работать на 30 и больше процентов! Даже игры, не использующие MMU стали эмулироваться быстрее на 6%. Теперь на мощных ПК игры, вроде Spider-Man 2, эмулируются в полную скорость.

Opportunistically predict BLR with RET

Здесь в очередной раз присутствует запутанное объяснение внесенных изменений – я даже не знаю, как правильно перевести заголовок, поэтому оставил его как есть. Главное – суть, а именно: увеличение скорости эмуляции большинства игр на 8%. Вроде и не очень много, но если все эти мелкие изменения сложить вместе, то получается нехилая прибавка в скорости. Не веришь, дорогой читатель? Тогда данный график тебя точно убедит: на нем показано изменение скорости эмуляции уровня Fountain of Dreams в игре Super Smash Bros. Melee, начиная с официального релиза Dolphin 4.0. Вопрос на миллион долларов: когда Fiora и Comex начали добавлять свои оптимизации в эмулятор? По вопросу миллиона обращайтесь к Kuro ;)
 

Масштабирование OpenGL XFB

Опция Real External FrameBuffer (RealXFB) используется в тех случаях, когда нам нужна самая точная эмуляция XFB. Большинство игр его даже не использует, и поэтому они могут спокойно эмулироваться без него, но малопопулярные игры, хомбрю программы и игры из виртуальной консоли значительно его задействуют.

Масштабирование RealXFB предназначается не для высоких разрешений, а для тех игр, которые перед отрисовкой XFB на экране масштабируют его необычным образом. Многие игры, работающие в низких разрешениях, используют эту функцию для заполнения всего экрана. Ярчайшим примером этому может служить The Legend of Zelda: Collector's Edition при отключенном режиме прогрессивной развертки.
 
масштабирование RealXFB отключено:                       масштабирование RealXFB включено:

Но RealXFB не доделан! Magumagu сделал эти изменения пару месяцев назад на неполной ветке эмулятора. И лишь недавно Sonicadvance1 подчистил код и добавил его в основную ветку. А что же в нем недоделанного, спросите вы? Никто так никогда и не внес поддержку RealXFB в видеорежим D3D! Поэтому разработчики приняли решение, что пусть игры хоть в одном видеорежиме работают правильным образом, чем вообще не работают.

Компилирование ARAM DMA Exception Checks в блоки JIT

Одно из тех изменений, которое влияет на многие игры совершенно по-разному. Оно повышает общую стабильность работы эмулятора, исправляет случайные вылеты в играх типа Mario Superstar Baseball.

Оно также влияет на звук в двух играх, Burnout 2: Point of Impact и Piglet's Big Game: в ранних версиях звук в них присутствовал, но он реализовывался через хаки (пользуясь случаем, передаю привет Сильву), которые ломали другие игры. Хаки убрали еще до 4.0 версии, а вместе с ними пропал и звук. Теперь он вернулся. Аллилуйя, братья!

Dualcore Determinism (для сетевой игры)

С того момента, как comex создал экспериментальную ветку Dualcore Netplay в конце прошлого года, пользователи просили добавить ее в основную версию эмулятора. Для тех, кто не в теме: благодаря Netplay, можно играть в мультиплеерные игры, рассчитанные на работу на одной приставке, через интернет. Увы, для работы этой функции Dolphin должен поддерживать идеальную синхронизацию между всеми игроками. Изначально для работы сетевой игры нужно было включать режим работы с одним ядром ЦП, включать звук LLE (или даже вообще его отключать) и проводить прочие свистопляски с бубном, отобранным у шамана-девственника в полнолунную ночь осеннего равноденствия по календарю Майя.

Но по мере улучшения Dolphin, эти требования, один за другим, исчезали. А теперь, благодаря Dualcore Determinism, пользователи могут в большинстве игр задействовать два ядра ЦП при игре через сеть.
 

Есть лишь один минус: как видно на графике, данный режим работает медленней полноценного Dual core. Но он работает гораздо быстрее одноядерного режима, а также старой сборки с режимом двух ядер DC-netplay 652, функционировавшей лишь с 25% игр.

Но данный режим может пригодиться не только для сетевой игры: поскольку он воспринимается играми как одноядерный режим, его можно использовать в тех играх, которые не работают, вылетают или имеют баги при работе в полноценном двухъядерном режиме. А это, в частности, игры серии Metroid Prime 2/3/Tri (баг с черной полосой) и Pokemon XD (вылет).

При запуске сетевой игры этот режим автоматически задействуется. Если он вам нужен не для игры по интернету, то его надо включить вручную, добавив строку GPUDeterminismMode fake-completion в ini-файл требуемой игры.

JITIL и его воскрешение

В этом месяце еще одной особенности Dolphin долгое время грозила участь отправиться на тот свет. Оптимизация JIT – благо для эмулятора, но многие такие изменения также влияют и на JITIL рекомпилятор, самым губительным образом. Поддерживать два режима JIT сложней, чем один, да и мало кто использовал экспериментальный JITIL рекомпилятор. Поэтому он за последние месяцы то работал, то не работал (в основном не работал), из-за вносившихся изменений в JIT. В итоге разработчики, после недолгих споров, готовились вырезать JITIL из Dolphin.

JITIL потенциально мог стать классной функцией, но его реализовали не в полной мере, по крайней мере, на данный момент. Он должен был стать более быстрой, более оптимизированной версией JIT, но эмулятор не достиг той стадии, когда для оптимизации необходим был промежуточный язык. JITIL был полезен тем, что благодаря своим кардинальным отличиям, он служил инструментом для обнаружения багов в JIT рекомпиляторе и даже интерпретаторе! Именно поэтому его и сохраняли.

Но Fiora и magumagu исправили в JIT и интерпретаторе столько проблем, что нужда в JITIL практически отпала, да и он все равно не работал. Поэтому казалось, что его время подошло к концу.

И тут на сцене появился Phire. Несмотря на занятость, он решил, что не может позволить вот так бесславно умереть JITIL. Он денно и нощно в поте лица работал над JITIL, возвращая его к жизни, даже вопреки тому, что он требовался лишь для некоторых игр. После первого объединения веток, он продолжил работы, исправив игры для Wii, Idle Skipping и даже вернув поддержку Fastmem!

После всего этого, JITIL ожил и стал работать почти на 50% быстрее, чем ранее. Однако через несколько недель изменения comex в BLR его снова поломали (и не только его: для исправления всех проблем пришлось вносить аж три коммита!). А почему он сломался? Потому что JITIL черт знает сколько времени не поддерживал Fastmem, и поэтому comex не заметил, что ему нужно было изменить коммит BLR (в котором менялся fastmem) с учетом JITIL. Небольшое исправление и, наконец, JITIL снова в рабочем строю. До тех пор, пока его опять кто-то случайно не сломает.

Скачать последние сборки эмулятора можно отсюда.
0

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

  1. Cyrax_X
    Cyrax_X от 3 октября 2014 20:47
    Круто.Молодцы ребята.
  2. drake3732
    drake3732 от 3 октября 2014 21:29
    ждал тему "Новости эмуляции" 3 дня
  3. Stalker4
    Stalker4 от 4 октября 2014 01:47
    Бенчмарк Dolphin: работает на 62% быстрее

    Это имеется ввиду вместе с прошлыми 26%?
  4. metalslayer
    metalslayer от 4 октября 2014 20:28
    Что там слышно про PCSX2?
  5. Stalker4
    Stalker4 от 5 октября 2014 08:48
    Я бы дал эмулю твердый регресс. Ну не заметны все эти изменения. Я помню в 2010 на слабом ноуте играл в фуллспиде RE Remake, а теперь тупит неимоверно. Да и во многих других играх скорость поубавилась
  6. Doragon
    Doragon от 5 октября 2014 12:53
    Самая лучшая новость от Dolphin, по моему мнению. Игра StarFox Adventure стала чуть ли не в 2 раза быстрее. Раньше, в кат-сценах и диалогах просадки с 60 до 30 фпс + такие же проседания были, когда много объектов на карте. Теперь это почти исчезло, хотя просадки всё еще бывают, но не 30 фпс, а на 5-10, реже - чуть больше.
  7. Stalker4
    Stalker4 от 6 октября 2014 06:41
    А какой видеорежим самый быстрый
  8. msblast
    msblast от 6 октября 2014 21:11
    Зашол через "ЛицоКнигу", чтобы написать "побольше бы таких статей, интересно читать"))
Добавить комментарий

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