[Перевод] Изменения в эмуляторе Dolphin с ноября по январь

ba120a785b32a6864c7c6b5e2f798933.jpg


В этом году мы достигли важной цели, к которой стремились почти десяток лет. В конце 2012 года Sonicadvance1 начал работать над ARM JIT эмулятора Dolphin. В те времена не существовало ни единого устройства, имевшего хотя бы малейшие надежды на работу Dolphin близко к полной скорости, но на самом деле не это было его задачей. Он лишь пытался проверить, можно ли это сделать; проект казался интересным и сложным. Однако с течением времени идея становилась чем-то большим, чем удовлетворение собственного любопытства. Пользователи с радостью донатили на покупку самого современного оборудования, позволяющего оставаться на переднем крае быстро эволюционирующей экосистемы, что позволило ARM-разработке развиваться. К 2015 году Sonicadvance1 поразил разработчиков и сообщество видеозаписью режима time trial игры Mario Kart: Double Dash!, работающего почти на полной скорости.
Мы прошли долгий путь.

Теперь мы с радостью готовы сообщить, что AArch64 JIT эмулятора Dolphin достиг по количеству поддерживаемых функций возможностей x86–64 JIT. Это означает, что каждая команда PowerPC, поддерживаемая x86–64 JIT наряду с каждой важной функцией JIT, теперь поддерживается и в AArch64 JIT! И это отличное время для ARM целом — каждое поколение процессоров расширяет границы возможного, а Apple и другие компании используют эту архитектуру в своих больших и мощных устройствах наподобие линейки M1 Mac. Пользователям мобильных телефонов и планшетов Adreno обеспечивает достаточно приличные графические драйверы, чтобы добиться вполне приемлемого игрового процесса. После устранения несколько дней назад критически важного «бутылочного горлышка» производительность GPU Adreno взлетела до небес.
Но это лишь верхушка айсберга; за три месяца у нас накопилось солидное количество изменений и других важных новостей об инфраструктуре. Мы значительно повысили удобство пользования на macOS и восстановили поддержку старых устройств. На самом деле, произошло так много всего, что мы подробно опишем состояние поддержки Dolphin в macOS ближе к концу статьи.

А теперь поговорим об исправлениях ошибок эмуляции. В последние три месяца произошло множество изменений, которые в обычной ситуации стали бы важными пунктами нашего отчёта. Пауза в три месяца не вызвана отсутствием изменений. Хотите поиграть в игры Riivolution по сети? Это уже возможно. Вас раздражают баги EA VP6? Забудьте о них, включив новую опцию. Хотите, чтобы ваша любимая игра с LogicOp работала на GLES или MoltenVK? Есть шансы, что это уже возможно! Список можно продолжать, но перечисление всего было бы слишком долгим процессом, поэтому давайте просто приступим к делу. Итак, представляем вашему вниманию отчёт о прогрессе за ноябрь, декабрь и январь!

Примечательные изменения


5.0–15952 — отключение перезапуска примитивов на Adreno, пользователи Dolphin на Android


Как написано в заголовке этого изменения, ответственным за него нельзя назвать какого-то конкретно разработчика или тестера. Это изменение стало возможным благодаря большому сообществу Android, потратившему кучу времени на то, чтобы выжать из мобильных устройств максимум. За последние четыре года в Dolphin появилось множество оптимизаций, исправлений и кучи функций, повышающих удобство использования. Однако, несмотря ни на что, многие пользователи остались приверженными к старым форкам, а некоторые попытались дополнить их современными функциями. Зачем тратить на всё это время? Ради производительности!

К сожалению, часто эти форки являлись личными проектами с запутанной историей, зачастую бессвязными логами изменений, а в некоторых даже не публиковался исходный код (это незаконно, не делайте так). Некоторые пользователи безгранично доверяют этим форкам, но нам было непонятно, почему, ведь очень сложно было понять, чем они отличаются. Одно можно было сказать точно: числа не врут, а пользователи утверждали, что эти старые форки позволяли их GPU работать с гораздо большими разрешениями, чем новые сборки, даже если это приводило к утере совместимости с играми или некоторых оптимизаций CPU. Как бы мы не старались, мы не могли устранить этот разрыв, по крайней мере, на линейке устройств Snapdragon.

И теперь мы знаем, почему так получилось.

Ближе к концу января Gamer64ytb сообщил, что разницу наконец удалось обнаружить. Одно из изменений в старом форке устраняло оптимизацию под названием «Primitive Restart». Создатель этого форка, пользователь weihouya, даже пытался поднять это изменение вверх по потоку до master, но из-за отсутствия опыта с проектами в Open Source и языкового барьера он внёс довольно неразборчивое изменение, судя по отчёту, не дававшее никаких преимуществ; он создал его просто потому, что ему не нравилось повышение сложности, вызванное Primitive Restart. Проверка временем не выявила никаких последующих преимуществ, однако изменение привело к проблемам с Vulkan на Android, поэтому разработчики Dolphin отказались мерджить изменение. Однако weihouya всё равно запушил его в свой форк и отдельно устранил проблемы с Vulkan. И благодаря этому ситуация получила развитие.

Функция Primitive restart позволяет сообщить OpenGL, что означает конкретное значение индекса, не использовать вершину по этому индексу в качестве источника, а начать новый примитив того же типа с новой вершиной.


Поначалу кажется, что Primitive Restart должна быть надёжной функцией, повышающей производительность. Она позволяет Dolphin уменьшить количество вызовов отрисовки благодаря объединению примитивов. На самом деле, некоторые игры для GameCube/Wii нативно используют Primitive Restart! К сожалению, из-за своей повышенной скорости Primitive Restart требует от драйвера GPU обрабатывать всё эффективнее, а в случае Adreno этого не происходило. На самом деле, функция так сильно потребляла ресурсы, что стала самым серьёзным «бутылочным горлышком» при использовании драйвера. А профилирование драйвера Adreno было непростой задачей, поэтому мы даже не могли толком понять, что это было проблемой. Только после того, как Gamer64ytb сообщил нам о своём открытии, мы смогли изучить и проанализировать всё сами.

o4v4emw-iip6zheooofq_ovcsto.png


График показывает очень чёткую картину. Это один из самых серьёзнейших скачков производительности, наблюдавшихся за долгое время. Он повлиял на все устройства Adreno и должен ускорять Dolphin в любой ситуации, когда производительность ограничена возможностями GPU. На мобильных устройствах ситуация такова для большинства игр, особенно если выбрано разрешение игры выше стандартного (1x Internal Resolution). Согласно информации от пользователей и наших личных тестов, иногда игры, раньше тормозившие при 2x от Internal Resolution, теперь работают при 4x от Internal Resolution с полной скоростью! Если у вас устройство с Adreno, и вы уже давно не пробовали запускать Dolphin, то у вас появилась возможность. Вероятно, вам понравится рост производительности, а также все прочие изменения, поднявшие совместимость приблизительно до уровня десктопных версий Dolphin.

К сожалению, отключение Primitive Restart не может решить все проблемы. Устройства Adreno нижнего уровня с чрезвычайно слабыми CPU не получат огромных преимуществ. Если вы не можете запустить игру в нативном разрешении, то велика вероятность, что обновление вам не поможет. Кроме того, от отключения Primitive Restart не получают никаких преимуществ Mali и Mediatek. Что же касается десктопов, то как и ожидалось, использование Primitive Restart чуть увеличивает производительность устройств NVIDIA и уже отключено для некоторых драйверов и бэкендов AMD. Это изменение и его последствия для производительности влияют только на устройства Adreno/Snapdragon. Впрочем, устройства Adreno/Snapdragon на данный момент являются одними из лучших мобильных устройств для запуска Dolphin.

5.0–15538 — поддержка MMU для AArch64 JIT, JosJuice


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

eebf62d726fb67b103269d76ff630192.jpg


MMU — это часть CPU консоли GameCube.

На GameCube и Wii игры вместо непосредственного доступа к ОЗУ взаимодействуют с виртуальной памятью, которая затем транслируется в физическую память при помощи Memory Management Unit (MMU). MMU является программируемым и даёт играм широкие возможности по манипуляции с виртуальной памятью. К счастью, большинство игр не используют преимущества этой функции и задействуют стандартное отображение памяти MMU. Следовательно, в подавляющем большинстве игр Dolphin мог просто транслировать виртуальную память в память хоста, что достаточно просто и быстро. Однако некоторые впечатляющие игры используют нестандартные отображения и имеют собственные обработчики исключений, чтобы при необходимости перемещать данные в памяти. Star Wars: The Clone Wars даже меняла Block Address Translations в процессе игры! Любая игра, в которой используются возможности MMU, заставляет Dolphin замедлиться и обратить на это внимание, чтобы можно было эмулировать все подобные поведения, создавая серьёзное «бутылочное горлышко» в эмуляции CPU. Хотя такие процессы никогда не будут малозатратными, x86–64 JIT эмулятора Dolphin делает всё возможное, чтобы максимально их ускорить.

В AArch64 JIT совершенно отсутствовала поддержка MMU, из-за чего все такие команды пропускались через интерпретатор на довольно слабых устройствах! Для того, чтобы игры наподобие Rogue Squadron 2, Rogue Squadron 3 и Spider-Man 2 хотя бы приблизились к полной скорости на устройствах AArch64, нужно было реализовать поддержку MMU в AArch64 JIT. Это изменение показало значительное повышение производительности во всех играх, использующих MMU. Теперь мечта о запуске некоторых из таких игр с полной скоростью на устройствах ARM не так уж далека от реальности.

gh3mbak0eixctweb-s8wo8qb91e.png


Стоит заметить, что это M1 Max — самое мощное устройство AArch64 на рынке, но даже оно не может выполнять Rogue Squadron 3 с полной скоростью. Это вызвано тем, что игры с MMU по-прежнему в целом гораздо более требовательны, а данная конкретная игра выполняет все действия, которые сложно эмулировать. Тем не менее, все игры с MMU работают лучше, а обычные игры с MMU можно даже запускать с полной скоростью на мощных устройствах AArch64.

5.0–15524 — поддержка Codegen Space Reuse на AArch64, JosJuice


Если «сырая» производительность вполне хороша, то следующим делом большинство пользователей стремится к как можно более плавному игровому процессу. И именно здесь на помощь приходит Codegen Space Reuse. Помечая пространства объявленного недействительным кода как многократно используемые, Dolphin может минимизировать затратные операции сброса кэша JIT и обеспечить плавную работу игры даже при генерации динамического кода. Эта функция появилась в x86–64 JIT эмулятора Dolphin больше года назад, но теперь JosJuice портировал её на AArch64 JIT.

В целом, это целевая оптимизация, нацеленная только на конкретные игры. Наверно, самой популярной игрой, страдавшей от этой проблемы, была Metroid Prime и другие игры на том же движке. У игр Nintendo 64 Virtual Console есть свой собственный JIT, поэтому они генерируют кучи кода и раньше постоянно работали рывками, потому что кэш сбрасывался один-два раза каждые пять минут, а теперь они в среднем требуют сброса кэша каждые тридцать минут. И, разумеется, мы не можем забыть с кошмаром управления памятью, из-за которого True Crime: New York City раньше работала так…


В большинстве случаев благодаря Codegen Space Reuse подобные проблемы полностью решились, а в самых сложных случаях стали значительно менее заметными. В большинстве игр из библиотеки при обычном игровом процессе вы никогда не увидите сброса кэша JIT.

Небольшое дополнение: вскоре после мерджа этой функции пользователи начали сообщать о серьёзных проблемах с производительностью в малом количестве игр, в том числе в Harry Potter and the Prisoner of Azkaban и F1 2002. Это было вызвано незначительными отличиями в реализации JIT между x86–64 JIT и the AArch64 JIT; проблему быстро устранили, изменив кэш AArch64 JIT, чтобы учесть некоторые различия в обработке определённых команд.

5.0–15484 — использование фильтра копирования и для EFB Copies, Pokechu22


Игры EA Sports Active стали ответом EA на безумную популярность игр Wii Fit. Несмотря на наличие на Wii других своих франшиз наподобие Madden NFL, FIFA, Need For Speed и многих других, согласно Википедии, EA Sports Active является лучшей по продажам игрой EA для Wii. Она была настолько популярной, что компания создала четыре игры EA Sports Active, в том числе и ту, в которой использовалась лицензия NFL.

Несмотря на то, что они кажутся простыми играми с физическими упражнениями, при запуске оригинальной EA Sports Active в Dolphin она выглядела не так, как привыкли пользователи.

2beb4cbc4099cc5a1fde008201ecde39.png


Можете не верить, но это баг.

Об этом баге было сообщено в 2013 году, но его случайно положили в долгий ящик, потому что EA Sports Active: More Workouts, EA Sports Active 2 и EA Sports Active: NFL Training Camp не страдали от этой проблемы, а система их наименований была сильно запутанной. Из-за этого она была ошибочно помечена как дубликат более типичного видеобага «VP6», хотя на самом деле это была уникальная проблема, найденная только в оригинальной игре!

Pokechu22 решил подробно разобраться с этим багом. Если вы хотите знать, что происходило, о чём, скорее всего, думали разработчики и как рендерилась игра, то стоит изучить статью Pokechu22. Здесь же мы изложим только самое основное.

В этой игре используется аппаратная функция GameCube и Wii под названием «Copy Filter». При копировании отрендеренного кадра из Embedded Frame Buffer (EFB) в основную память оборудование может без затрат добавлять очень простые эффекты к каждой строке изображения. Это можно использовать для небольшого размытия изображения, например, фильтров «Deflicker» в серии Super Smash Bros. или для осветления/затемнения изображения, как это использовалось для переходов в Rogue Squadron 2, или для изменений гаммы в Metroid Prime. Это непрограммируемая функция оборудования, поэтому после того, как мы реализовали её несколько лет назад, мы были уверены, что столкнулись с последней проблемой, связанной с Copy Filter. Однако мы сделали ошибочное допущение, которое ударит по нам позже.

В EA Sports Active, Pokechu22 обнаружил ещё один хитрый способ применения Copy Filter — фильтрацию цвета! Благодаря его исследованию мы наконец смогли увидеть, как игра выглядит до и после фильтрации Copy Filter.

bb916033b62a9f87768f996637b6f6d1.png


Базовые цвета выглядят немного поблёкшими.

5cd55bf9b177e584cc3b0ed380a88de3.png


После фильтрации игра выглядит чуть красивее.

Так как же EA Sports Active реализовала это и что конкретно делала игра? Игра делала две разные копии EFB для каждого кадра. Первая копия брала красный и зелёный каналы изображения, а вторая копия брала синий канал и использовала Copy Filter для получения 1/16 от значения текущей строки. Благодаря такому разделению значений игра способна выполнять собственное смешение цветов/альфы для создания более контрастных сцен с яркими цветами.

При реализации Copy Filter мы заметили, что каждое известное применение Copy Filter выполнялось исключительно в XFB Copies — особый тип EFB Copy, в котором кадр перемещается в особую область основной памяти, предназначенный для сканирования. Поэтому мы предположили, что эффекты copy filter могут использоваться только для XFB Copies, и полностью исключили стандартные EFB Copies из Copy Filter. EA Sports Active доказала, что мы были неправы. Просто позволив EFB Copies проходить через Copy Filter (тривиальное изменение), Pokechu22 смог устранить проблему и теперь трюки с цветами EA Sports Active работают, как задумано.

bed38f39826f78029dbc8dc2298118bc.png


Игра с багом обладает определённым шармом.

5effbe6255b19584e1544ebe60071007.png


А после его устранения… Становится гораздо скучнее.

Как ни удивительно, после реализации исправления мы выяснили, что EA Sports Active — не единственная игра, использующая таким образом фильтрацию цветов! В The Last Airbender, основанной на хитовом фильме, который любят вспоминать фанаты «Аватара», использовалась похожая система фильтрации, только с гораздо менее интересной цветовой палитрой.

530b1b100cbb7b66f43564e4976dcf8e.png


Если приглядеться, можно увидеть те же артефакты в оттенках серого, которые мы видели в EA Active.

2e719d0268dbff37c1126369beae0691.png


После устранения проблемы серый фон остался серым, но теперь мы видим объекты.

Как и случается с любым серьёзным изменением в эмуляции, добавление этого исправления вызвало различные мелкие проблемы. К счастью, регрессии были обнаружены и исправлены в 5.0–15518. После чего было найдено ещё несколько неполадок, которые были устранены в 5.0–15950. Кроме того, сломалась одна из функций отладки, которую мы наконец исправили в 5.0–15961.

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

271e53096604ba3b3e627224ec80b5ff.png


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

91f341fae709dd00ed97733d05a29235.png


Однако Dolphin рендерит её как белую с розовыми и синими оттенками. К счастью, над исправлением уже работают.

Если вы подробнее хотите узнать об этой проблеме, то прочитайте статью Pokechu22 об этом баге. В ней приведены подробности, которых мы не сможем изложить в отчёте!

5.0–15515 — поддержка ручной обработки сдвига и сэмплирования текстур, Pokechu22


Устранение проблемы с выцветанием EA Sports Active стало победой, однако, к сожалению, существовала ещё одна проблема, воздействовавшая на неё и ещё более сотни прочих игр. Ассортимент игр был широк — от спортивных игр EA до серии James Bond, различных игр Harry Potter, множества игр Need for Speed, бесконечной серии Just Dance и даже странных исключений типа Target: Terror. Велики шансы на то, что если вы владеете большой библиотекой игр, хотя бы на одну из них повлиял этот баг… если вы играете на определённом оборудовании.

00662d774487eae29954d8c7c3ee5800.png


Если ваш GPU страдает от этого бага, то катсцены из James Bond смотреть будет немного сложно.

a30395d69fdafb810cd3f51b1601e7de.png


У других GPU вообще не было никаких проблем.

a1f5df85138c5a38288938483c811ba6.jpg


Фоны и спрайты Target: Terror представляют собой FMV.

abedc91bf10a1e7a014ce793f7e8cba1.jpg


Если приглядеться, вы увидите знакомые строки с багами, так как скриншоты сделаны на машине с NVIDIA.

Возможно, некоторые читатели сейчас недоумевают. Наверно, вы играли во многие из упомянутых мной игр и никогда не видели подобных дефектов. Так получилось, потому что в основном они возникают в GPU NVIDIA. Существуют исключения, но если вы не играете на GPU NVIDIA, то высока вероятность, что подобных проблем у вас не было. Пользователей графических карт AMD эта проблема совершенно не затронула, как и большинство пользователей телефонов и планшетов, поскольку на Adreno и Mali этот баг не проявляется.

Это полностью вызвано особенностями сэмплирования текстур. Сэмплирование текстур — это операция считывания данных текстур (их данных цвета, координат текстур и т. п.), а также фильтрации текстур. Так как эта функция используется множество раз за кадр, она должна быть чрезвычайно быстрой, поэтому даже самые новые GPU используют оборудование с фиксированными функциями для ускорения этой задачи. Однако не все GPU сэмплируют текстуры одинаково, но обычно различия настолько малы, что ограничены тонкостями на уровне субпикселей.

Видео, на которые влияет этот баг, состоят из множества мелких и крупных текстур, из которых собирается каждый кадр видео; разрешение такого видео не соответствует разрешению игры. Это уже создаёт МНОЖЕСТВО возможностей для возникновения различий в интерполяции, однако эти видеокодеки ещё сильнее усугубляют ситуацию. Видео используют данные о цвете из одной текстуры для создания смещения координат текстур, используемых при считывании второй текстуры. Это приводит к каскаду ошибок округления, когда даже крошечные различия становятся сильно заметны. Мы понимаем, почему разработчики так делали, однако из-за этого видео становятся чрезвычайно хрупкими и для их точного воспроизведения требуется огромная точность. Если посмотреть на лог изменений формата Bink Video той эпохи, то можно увидеть, что его разработчики боролись с этой проблемой и на реальных консолях.

Почему баг не влияет на некоторые графические карты? Мы не знаем точно, но можем предположить, почему он не затронул карты AMD. Внутри GameCube и Wii установлены графические процессоры ArtX. Эта компания была поглощена и превратилась в ATi, а затем её купила AMD. Похоже, поведение при сэмплировании текстур не изменилось со времён GameCube, поэтому эти проблемы не проявляются на современном оборудовании. Это относится и к пользователям Adreno, так как их оборудование тоже восходит корнями к ArtX.

841d344a04b6d02b6a54e9c4b4d37d81.png


Плюс одно очко Adreno!

К сожалению, пользователям Nvidia не повезло. Они будут видеть визуальные баги в видео VP5, VP6 и Bink, в которых применялись эти техники. Хуже того, проблема коснулась не только FMV, например, она есть и в текстовых полях Mario Party 7 или видеоэлементах геймплея Target: Terror, которая использует Bink Video в анимированных спрайтов для имитации внешнего вида классического аркадного шутера!

До недавнего времени пользователям Nvidia просто приходилось мириться с этими проблемами. Они были связаны с низкоуровневыми различиями в GPU, поэтому разве их можно устранить? Ну, нужно просто перестать пользоваться ошибочно работающим оборудованием GPU и реализовать сэмплирование текстур самостоятельно!

Примечание: драйверы «RADV» в Open Source для графических карт AMD демонстрируют баги сэмплирования. Хотя сэмплированием текстур занимается низкоуровневое оборудование GPU, драйвер GPU вполне может повлиять на работу низкоуровневых функций оборудования. Странно, но дефекты драйверов RADV в таких ситуациях немного отличаются от дефектов всех других графических карт: вертикальные линии как будто составлены из точек.

Разбираемся с сэмплированием


По большей мере при сэмплировании текстур Dolphin не делал ничего особо странного. За пределами шейдера Dolphin сообщал своему графическому бэкенду, что делать при сэмплировании текстуры, например, линейное сэмплирование, mip-текстурирование, сворачивание по горизонтали/вертикали, и так далее. Вне зависимости от переданных команд шейдер затем вызывал оборудование GPU с фиксированными функциями для сэмплирования текстуры с выбранными параметрами. Учитывая, что это работало не со всеми GPU, нужно было придумать новое решение. Pokechu22 решил найти способ ручного сэмплирования текстур вместо использования блока сэмплирования текстур графической карты. Хотя это требовало намного больше работы и к тому же вызывало вопросы с производительностью, сам Dolphin мог считывать и фильтровать текстуры вручную, чтобы обеспечить постоянство и точность результатов. Далее шейдер мог посмотреть на конфигурацию текстур и узнать ближайшие координаты, уровни mipmap и другие параметры с большей точностью.

0be030fe464cdff62b56f32abb6b0568.png


Неточное сэмплирование текстур может привести к созданию уродливых линий даже при нативном разрешении.

2523e28ee8b3d346c9444b0b97cf629c.png


Ручное сэмплирование текстур полностью устраняет эту проблему.

Эксперимент сразу же увенчался огромным успехом, однако для поддержки буквально всего, на что способен Dolphin, требовалась куча работы. Чтобы проработать всё, потребовались месяцы, однако повышенный уровень контроля позволил Dolphin эмулировать самые странные случаи обработки текстур GameCube и Wii. Большинство таких случаев не встречается в розничных играх, но иногда возникает в модах и homebrew, тестированных в Dolphin. Вот один из примеров: разработчик Star Fox Adventures: Amethyst Edition сообщил, что текстуры, хорошо работавшие в Dolphin, на консоли работали неверно. Однако благодаря ручному сэмплированию текстур мы смогли заставить текстуры вести себя точно, не заставляя пользователей включать программный рендерер. Если вы используете ручное сэмплирование текстур при 1x Native Internal Resolution и отключенной функции Load Custom Textures, то теперь мы можете наблюдать проблемы с необычными текстурами, которые ранее рендерились правильно.

c6b4c76438fad44407d7eb454a45cd23.png


Стандартная обработка текстур Dolphin принимала эти деформированные текстуры и обрабатывала из без проблем. Это является некорректной эмуляцией.

ad22709ee226df128155295f12c62ae5.jpg


Для тех, кто стремится к максимально точной картинке, Pokechu22 также добавил поддержку диагонального уровня детализации, обеспечивающего более точный выбор правильной mip-текстуры, если игра решает её использовать. Это приводит к очень незначительным отличиям, которые заметны, если только напрямую сравнивать идентичные скриншоты эмулятора и консоли. На данный момент у всех этих крутых функций и исправлений не выявлено регрессий, поэтому их достаточно безопасно использовать, если вы хотите разобраться, связаны ли графические проблемы с сэмплированием текстур. Только обратите внимание, что улучшение «Anisotropic Filtering» пока не реализовано в ручном сэмплировании текстур, поэтому при включенном Manual Texture Sampling эта функция ничего не делает.

Опасности производительности


Мы уже рассказали о повышении точности, качества картинки и об уменьшении зависимости от особенностей GPU без визуальных регрессий. Но пока мы почти не говорили о производительности. Так как мы обходим использование специализированного оборудования, задача которого заключается в обеспечении максимально возможной скорости сэмплирования текстур, это не может не повлиять на производительность. Однако на самом деле история довольно сложная — поведение Manual Texture Sampling зависит от архитектуры и вычислительной мощи GPU, а также от разрешения, с которым вы хотите играть. При низких разрешениях, например, 1–2x Native Internal Resolution, «бутылочного горлышка» почти не возникает. На самом деле, на определённом оборудовании некоторые игры даже работают быстрее. Однако при определённом разрешении, обычно примерно при 3–4x Native, это становится заметным узким местом производительности.

cxqrg3dp1ow-kdnny7qgqkqgg7u.png


Если вы играете на мощнейшем GPU, есть вероятность, что производительность при разумных разрешениях не снизится. На тех, кто играет на более скромном оборудовании, снижение повлияет чуть сильнее. А машины пользователей со старыми архитектурами GPU, которые более чувствительны к этому, например Pascal, пострадают ещё сильнее. Учитывая, что это влияет только на определённое оборудование и снижение производительности изменяется в зависимости от разрешения и архитектуры GPU, мы по большей мере пока оставили эту опцию отключенной. В некоторых играх с активным использованием FMV и незначительным влиянием этой опции (например, Just Dance) мы решили по умолчанию включить её, потому что такие игры обычно не ограничены мощностью GPU и повышение разрешения в них не даёт почти никаких преимуществ. Если бы эта особенность влияла на все графические карты, решение о включении опции принимать было бы гораздо проще, но увы, это не так.

В конечном итоге, нам, возможно, придётся придумать условные стандартные параметры, зависящие от оборудования пользователя, почти как в случае с багом деталей драйвера, но на этот раз параметры будут зависеть от конкретной игры. Если вы играете на карте, подверженной влиянию этого бага, то параметр «Manual Texture Sampling» находится в области «Advanced» меню Graphics Settings. Если вы включите Manual Texture Sampling, то Dolphin будет сэмплировать текстуры вручную, включив все прочие бонусы точности. На данный момент мы планируем найти игры, в которых есть сильные баги с «Fast Texture Sampling», вплоть до того, что они становятся неиграбельными, и постепенно включать Manual Texture Sampling для каждой конкретной игры. К сожалению, это означает, что у некоторых пользователей, графические карты/драйверы которых не имеют этой ошибки, параметр будет включен, несмотря на то, что на самом деле он не требуется. Мы продолжим попытки делать интеллектуальный выбор по включению этой функции, особенно когда получим больше данных об играх, на которые она влияет и как она проявляет себя на подавляющем количестве машин, на которых наши пользователи запускают Dolphin.

5.0–15520 и 5.0–15604 — исправления, дополнения и поддержка сетевой игры для Riivolution, AdmiralCurtiss


Когда в Dolphin добавили High Level Emulation (HLE) для запуска и конфигурирования модов Riivolution, пользователи сразу полюбили эту функцию и мы получили множество благодарностей и запросов о поддержке. Исходная реализация была достаточно хорошей, но мы никак не могли протестировать каждый мод и найти каждый пограничный случай. Последние три месяца AdmiralCurtiss занимался починкой модов Riivolution, которые не запускались в Dolphin, и добавлением самых запрашиваемых функций. Большинство багов было очень глупым и связано с такими аспектами, как чувствительность к регистру имён файлов и путей, дубликатов файлов в моде и в основном находилось в хаотично изготовленных модах.

41c34c281175262c686fc15605b666c0.jpg


В Wii Sports Resort: Storm Island используются очень специфичные поведения Riivolution.

Что касается новых функций, то AdmiralCurtiss реализовал несколько важных возможностей. Во-первых, теперь пользователи могут создавать записи списка игр для модов Riivolution, что позволяет запускать предварительно настроенные моды непосредственно из списка игр!

1202f733db57c24312b90701a44e22ef.png


Создать записи списка игр для модов можно из меню Riivolution, после чего их можно запускать прямо из списка игр!

Поначалу это может показаться чем-то несерьёзным, но это было одним из основных требований для запуска модов Riivolution в Netplay! Добавив конфигурацию Riivolution в список игр, вы сможете использовать её для сетевой игры. Если у всех игроков в сетевой сессии мод Riivolution настроен правильно, он будет работать точно так же, как любая другая игра в сетевом режиме.

Примечание: Wii Remote Netplay по-прежнему является экспериментальной функцией, и работает только с Emulated Wii Remotes. Но даже в этом случае некоторые действия, например. отключение Wii Remotes, могут вести себя в сетевом режиме неправильно, а неверно сконфигурированные сетевые сессии могут зависать при запуске. Моды Riivolution для игр GameCube и Wii с поддержкой контроллеров GameCube гораздо проще в настройке и синхронизируются без проблем.

Примечание 2: если вы планируете использовать Wii Netplay, то установите версию 5.0–15559 или более новую по причинам, о которых мы расскажем чуть ниже.

5.0–15549 и 5.0–15559 — исправление завершения сетевой игры и и сохранений Wii, AdmiralCurtiss


Несмотря на годы работы, Wii Netplay по-прежнему находится в экспериментальном состоянии. С этой функцией связано множество трудностей, например, внутренняя память Wii, системные файлы и, разумеется, эти вредные Wii Remotes. Инфраструктура сетевых игр Dolphin была спроектирована задолго до того, как появилась идея о возможности реализации сетевого режима для игр Wii, поэтому большая часть сетевого режима Wii в Dolphin надстроена над старым фундаментом. Синхронизация карт памяти — это одно дело, но как синхронизировать NAND, которая может иметь размер 500 МБ и содержать защищённые копирайтом данные? На самом деле, синхронизация NAND — основная причина множества багов Wii Netplay.

Чтобы избежать проблем и с законом, и с каналом передачи, Dolphin подготавливает для сетевой игры «пустую» NAND, а затем импортирует необходимые файлы сохранений для игр, в которые игроки хотят сыграть по сети. Это минимизирует необходимый объём данных и позволяет избежать юридических проблем. После завершения сетевой игры эти файлы импортируются обратно в исходную NAND, если пользователь включил функцию «запись сохранений»… и здесь возникла очень неприятная проблема, которая может повлиять на сохранение в настоящей NAND пользователя.

Из-за неудачного состояния гонки в сочетании с желанием Wii Remotes ломать Netplay исходное сохранение могло быть потеряно в процессе экспорта. При очистке части кодовой базы, относящейся к сетевому режиму игр Riivolution, AdmiralCurtiss заметил несколько таких проблем и понял, что не может разобраться, как код должен был работать изначально. Это может показаться возмутительным, но такое случается довольно часто, когда начинаешь изучать старые части проекта, существующего уже очень давно. Единственный вариант решения здесь — переписать и исправить код, чтобы он, по крайней мере, снова заработал. В своём текущем состоянии функци

© Habrahabr.ru