В этом году мы достигли важной цели, к которой стремились почти десяток лет. В конце 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 сообщил нам о своём открытии, мы смогли изучить и проанализировать всё сами.
График показывает очень чёткую картину. Это один из самых серьёзнейших скачков производительности, наблюдавшихся за долгое время. Он повлиял на все устройства 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.
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 не так уж далека от реальности.
Стоит заметить, что это 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 она выглядела не так, как привыкли пользователи.
Можете не верить, но это баг.
Об этом баге было сообщено в 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.
Базовые цвета выглядят немного поблёкшими.
После фильтрации игра выглядит чуть красивее.
Так как же 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 работают, как задумано.
Игра с багом обладает определённым шармом.
А после его устранения… Становится гораздо скучнее.
Как ни удивительно, после реализации исправления мы выяснили, что EA Sports Active — не единственная игра, использующая таким образом фильтрацию цветов! В The Last Airbender, основанной на хитовом фильме, который любят вспоминать фанаты «Аватара», использовалась похожая система фильтрации, только с гораздо менее интересной цветовой палитрой.
Если приглядеться, можно увидеть те же артефакты в оттенках серого, которые мы видели в EA Active.
После устранения проблемы серый фон остался серым, но теперь мы видим объекты.
Как и случается с любым серьёзным изменением в эмуляции, добавление этого исправления вызвало различные мелкие проблемы. К счастью, регрессии были обнаружены и исправлены в 5.0-15518. После чего было найдено ещё несколько неполадок, которые были устранены в 5.0-15950. Кроме того, сломалась одна из функций отладки, которую мы наконец исправили в 5.0-15961.
К сожалению, нам нужно разобраться ещё с несколькими мелочами. В процессе работы над этим отчётом мы заметили небольшие странности одного персонажа, которые не возникают на консоли.
После фильтрации на консоли на этом персонаже всё равно надета вполне обычная голубая футболка.
Однако Dolphin рендерит её как белую с розовыми и синими оттенками. К счастью, над исправлением уже работают.
Если вы подробнее хотите узнать об этой проблеме, то прочитайте статью Pokechu22 об этом баге. В ней приведены подробности, которых мы не сможем изложить в отчёте!
5.0-15515 — поддержка ручной обработки сдвига и сэмплирования текстур, Pokechu22
Устранение проблемы с выцветанием EA Sports Active стало победой, однако, к сожалению, существовала ещё одна проблема, воздействовавшая на неё и ещё более сотни прочих игр. Ассортимент игр был широк — от спортивных игр EA до серии James Bond, различных игр Harry Potter, множества игр Need for Speed, бесконечной серии Just Dance и даже странных исключений типа Target: Terror. Велики шансы на то, что если вы владеете большой библиотекой игр, хотя бы на одну из них повлиял этот баг… если вы играете на определённом оборудовании.
Если ваш GPU страдает от этого бага, то катсцены из James Bond смотреть будет немного сложно.
У других GPU вообще не было никаких проблем.
Фоны и спрайты Target: Terror представляют собой FMV.
Если приглядеться, вы увидите знакомые строки с багами, так как скриншоты сделаны на машине с NVIDIA.
Возможно, некоторые читатели сейчас недоумевают. Наверно, вы играли во многие из упомянутых мной игр и никогда не видели подобных дефектов. Так получилось, потому что в основном они возникают в GPU NVIDIA. Существуют исключения, но если вы не играете на GPU NVIDIA, то высока вероятность, что подобных проблем у вас не было. Пользователей графических карт AMD эта проблема совершенно не затронула, как и большинство пользователей телефонов и планшетов, поскольку на Adreno и Mali этот баг не проявляется.
Это полностью вызвано особенностями сэмплирования текстур. Сэмплирование текстур — это операция считывания данных текстур (их данных цвета, координат текстур и т. п.), а также фильтрации текстур. Так как эта функция используется множество раз за кадр, она должна быть чрезвычайно быстрой, поэтому даже самые новые GPU используют оборудование с фиксированными функциями для ускорения этой задачи. Однако не все GPU сэмплируют текстуры одинаково, но обычно различия настолько малы, что ограничены тонкостями на уровне субпикселей.
Видео, на которые влияет этот баг, состоят из множества мелких и крупных текстур, из которых собирается каждый кадр видео; разрешение такого видео не соответствует разрешению игры. Это уже создаёт МНОЖЕСТВО возможностей для возникновения различий в интерполяции, однако эти видеокодеки ещё сильнее усугубляют ситуацию. Видео используют данные о цвете из одной текстуры для создания смещения координат текстур, используемых при считывании второй текстуры. Это приводит к каскаду ошибок округления, когда даже крошечные различия становятся сильно заметны. Мы понимаем, почему разработчики так делали, однако из-за этого видео становятся чрезвычайно хрупкими и для их точного воспроизведения требуется огромная точность. Если посмотреть на лог изменений формата Bink Video той эпохи, то можно увидеть, что его разработчики боролись с этой проблемой и на реальных консолях.
Почему баг не влияет на некоторые графические карты? Мы не знаем точно, но можем предположить, почему он не затронул карты AMD. Внутри GameCube и Wii установлены графические процессоры ArtX. Эта компания была поглощена и превратилась в ATi, а затем её купила AMD. Похоже, поведение при сэмплировании текстур не изменилось со времён GameCube, поэтому эти проблемы не проявляются на современном оборудовании. Это относится и к пользователям Adreno, так как их оборудование тоже восходит корнями к ArtX.
Плюс одно очко 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 и другие параметры с большей точностью.
Неточное сэмплирование текстур может привести к созданию уродливых линий даже при нативном разрешении.
Ручное сэмплирование текстур полностью устраняет эту проблему.
Эксперимент сразу же увенчался огромным успехом, однако для поддержки буквально всего, на что способен Dolphin, требовалась куча работы. Чтобы проработать всё, потребовались месяцы, однако повышенный уровень контроля позволил Dolphin эмулировать самые странные случаи обработки текстур GameCube и Wii. Большинство таких случаев не встречается в розничных играх, но иногда возникает в модах и homebrew, тестированных в Dolphin. Вот один из примеров: разработчик Star Fox Adventures: Amethyst Edition сообщил, что текстуры, хорошо работавшие в Dolphin, на консоли работали неверно. Однако благодаря ручному сэмплированию текстур мы смогли заставить текстуры вести себя точно, не заставляя пользователей включать программный рендерер. Если вы используете ручное сэмплирование текстур при 1x Native Internal Resolution и отключенной функции Load Custom Textures, то теперь мы можете наблюдать проблемы с необычными текстурами, которые ранее рендерились правильно.
Стандартная обработка текстур Dolphin принимала эти деформированные текстуры и обрабатывала из без проблем. Это является некорректной эмуляцией.
Для тех, кто стремится к максимально точной картинке, Pokechu22 также добавил поддержку диагонального уровня детализации, обеспечивающего более точный выбор правильной mip-текстуры, если игра решает её использовать. Это приводит к очень незначительным отличиям, которые заметны, если только напрямую сравнивать идентичные скриншоты эмулятора и консоли. На данный момент у всех этих крутых функций и исправлений не выявлено регрессий, поэтому их достаточно безопасно использовать, если вы хотите разобраться, связаны ли графические проблемы с сэмплированием текстур. Только обратите внимание, что улучшение «Anisotropic Filtering» пока не реализовано в ручном сэмплировании текстур, поэтому при включенном Manual Texture Sampling эта функция ничего не делает.
Опасности производительности
Мы уже рассказали о повышении точности, качества картинки и об уменьшении зависимости от особенностей GPU без визуальных регрессий. Но пока мы почти не говорили о производительности. Так как мы обходим использование специализированного оборудования, задача которого заключается в обеспечении максимально возможной скорости сэмплирования текстур, это не может не повлиять на производительность. Однако на самом деле история довольно сложная — поведение Manual Texture Sampling зависит от архитектуры и вычислительной мощи GPU, а также от разрешения, с которым вы хотите играть. При низких разрешениях, например, 1-2x Native Internal Resolution, «бутылочного горлышка» почти не возникает. На самом деле, на определённом оборудовании некоторые игры даже работают быстрее. Однако при определённом разрешении, обычно примерно при 3-4x Native, это становится заметным узким местом производительности.
Если вы играете на мощнейшем 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, и добавлением самых запрашиваемых функций. Большинство багов было очень глупым и связано с такими аспектами, как чувствительность к регистру имён файлов и путей, дубликатов файлов в моде и в основном находилось в хаотично изготовленных модах.
В Wii Sports Resort: Storm Island используются очень специфичные поведения Riivolution.
Что касается новых функций, то AdmiralCurtiss реализовал несколько важных возможностей. Во-первых, теперь пользователи могут создавать записи списка игр для модов Riivolution, что позволяет запускать предварительно настроенные моды непосредственно из списка игр!
Создать записи списка игр для модов можно из меню 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 заметил несколько таких проблем и понял, что не может разобраться, как код должен был работать изначально. Это может показаться возмутительным, но такое случается довольно часто, когда начинаешь изучать старые части проекта, существующего уже очень давно. Единственный вариант решения здесь — переписать и исправить код, чтобы он, по крайней мере, снова заработал. В своём текущем состоянии функция Dolphin Netplay, похоже, делала предположения, которые уже не были истинными из-за изменений в других частях кодовой базы.
Насколько мы знаем, в последних сборках был устранён баг с потерей сохранения, то есть сохранения снова можно безопасно использовать в сетевом режиме. Исходное сохранение с реальной NAND больше никогда не будет потеряно. Однако если Dolphin вылетит во время сетевой игры, обновления состояния сохранения, внесённые в процессе сетевой игры, не будут экспортированы в основную NAND. Не паникуйте, если такое случится! Сохранённые данные из сетевой сессии всё равно можно будет извлечь из папки Wii.backup, содержащейся в пользовательских файлах Dolphin, и преобразовать вручную. Учтите, что при запуске Dolphin и другой игры эти файлы будут очищены.
5.0-15579 — прерывания задержек одноядерных GPU, phire
Single Core — это опция повышения точности Dolphin, которая в большинстве случаев помогает со многими случайными вылетами и зависаниями. Но в небольшом количестве игр более стабильной опцией является Dual Core. Одной из таких игр является Bomberman Jetters, и причина этого довольно любопытна.
Для начала стоит сообщить, что GameCube и Wii — это одноядерные консоли, поэтому в основной рабочей нагрузке можно попытаться распараллелить только очень немногие задачи. Однако первые разработчики Dolphin осознали, что работу CPU, связанную с GPU, например, передачу графических данных и тому подобное, можно достаточно безопасно выделить во второе ядро CPU хост-машины. В конце концов, вычисления CPU не очень часто взаимодействуют с работой CPU, связанной с GPU. Это означало, что они могут выполняться параллельно на отдельных ядрах CPU хоста и синхронизироваться только в важные моменты (например, в определённых прерываниях), что сильно увеличит производительность. Хотя сегодня мы знаем, что Dual Core является источником множества случайных вылетов, в своей изначальной реализации режим Dual Core не был столь проблематичен, как сегодня; обычно скорости потока GPU хватало с запасом и пользователи всегда были ограничены потоком CPU. Однако с момента реализации TEV_Fixes_New профиль производительности Dolphin изменился, и теперь поток CPU стал быстрее, а потоку GPU из-за улучшения эмуляции приходится делать гораздо больше.
Это создаёт ситуацию, в которой поток CPU может слишком обогнать поток GPU, а если поток GPU слишком опоздал, когда происходит прерывание, могут возникнуть проблемы синхронизации. Мы практически ничего не можем сделать с этой проблемой — Dual Core быстр потому, что потоки выполняются без особой синхронизации. Если увеличить синхронизацию для устранения ошибок, производительность снизится. Кроме того, на этом этапе Single Core был достаточно хорошо оптимизирован и на многих компьютерах работал вполне неплохо без всякого риска. Если у игры возникают проблемы с Dual Core, то стоит выбрать эту по-настоящему детерминированную опцию.
Bomberman Jetters — одна из тех игр, в которых отсутствие синхронизации Dual Core на самом деле является благом. Игра ожидает, что обработка FIFO GPU займёт время. В режиме Dual Core это происходит благодаря чистой случайности, поскольку поток CPU и поток GPU встречаются только иногда. Single Core выполняет всё в точном порядке в одном потоке, без каких-либо задержек. Хуже того, время исполнения будет датироваться тем временем, когда была впервые отправлена команда FIFO, то есть после отправки команды игрой прошо нулевое время!
Вместо того, чтобы корректно эмулировать весь конвейер, phire придумал исправление на скорую руку, приближающее исполнение FIFO на Single Core к правильному. Благодаря этому изменению исполнение FIFO передаётся через планировщик прерываний, который может обеспечивать задержки и гарантирует, что прерывания происходят в нужное время. Здесь мы просто принудительно выставляем минимальное время ожидания, чтобы эти прерывания, происходившие мгновенно, происходили чуть позже в будущем с момента их отправки. Это не совсем устраняет источник проблемы, но этого достаточно для запуска игры. К сожалению, эта игра всё равно подвержена случайным зависаниям даже после устранения зависания при запуске. Но теперь мы нашли способ их обойти — небольшое уменьшение тактовой частоты эмулируемого CPU значительно (а, возможно, и полностью) снижает вероятность зависания игры.
Символично, что эта игра превращается в Dolphin в бомбу с тикающим часовым механизмом...
Это также влияет на некоторые продукты Datel и Resident Evil 3 при работе на Single Core, предотвращая зависания игры. Это важно, поскольку такая продукция Datel не работала на Dual Core. С Resident Evil 3 получилось нечто среднее. Игра работает на Dual Core, но на некоторых устройствах есть очень небольшая вероятность зависания, если что-то пойдёт не так. При нашем ограниченном тестировании нам вообще не удалось вызвать никаких зависаний в Resident Evil 3, однако некоторые переходы занимают слишком много времени, в том числе самая первая дверь, на которой игра ранее зависала. Если эта проблема схожа с проблемой Bomberman Jetters, то есть вероятность, что небольшое снижение тактовой частоты эмулируемого CPU устранит все оставшиеся проблемы.
5.0-15586 — отсутствие сброса флагов RTC при сбросе BS2, Pokechu22
Некоторые пользователи и разработчики любят пользоваться Wii Menu (обычно называемым System Menu). Очень интересно изучать некоторые каналы и просматривать различные анимированные баннеры игр, не отображающиеся в стандартном GUI Dolphin. Однако если запустить игру и вернуться в меню Wii Menu, то игра, в которую вы играли, не будет отображаться Disc Channel. Так получается, потому что Dolphin сбрасывал флаги RTC (Real Time Clock) при сбросе, поэтому эмулируемая консоль не знала, что должна обновить кэш Wii Menu и вставленный диск, из-за чего использовались устаревшие данные. Pokechu22 исправил это поведение, поэтому после сброса в канале дисков теперь отображается правильный диск.
Теперь вам не нужно принудительно менять диск после каждого сброса, чтобы отобразилась правильная игра.
5.0-15676 — исправление LogicOps в OpenGLES (Android) и MoltenVK (macOS), OatmealDome
Это обходной путь решения проблемы отсутствия поддержки LogicOps в Metal (MoltenVK) и многих мобильных драйверах (Adreno, Mali и т. д.), которые не поддерживают OpenGLES и расширение Vulkan. Однако на этот раз мы не меняем одну сломанную игру на другую; OatmealDome воспользовался улучшением ситуации в Android вместе с небольшим хаком MoltenVK, чтобы получить правильный результат в играх LogicOps на устройствах, которых затронула проблема.
Хотя OatmealDome лучше всего известен работой над функциями для устройств Apple, в том числе форком Dolphin, предназначенным для запуска на устройствах iOS, он также взял на себя ношу поддержки сборок Dolphin для macOS. Он создал исправления для MoltenVK, помог обновить бота сборки и в целом улучшил удобство работы в macOS. В данном случае он хотел исправить функции LogicOps в MoltenVK, но столкнулся с тем, что среды OpenGLES (Android без устройств NVIDIA) страдают от той же проблемы. Некоторое время назад Stenzek добавил аппроксимацию LogicOps при помощи смещения для исправления Mario Kart Wii на устройствах Windows 7 с D3D11 и OpenGLES.
К сожалению, восстановление части эмуляции сломало работу в других ситуациях, из-за чего некоторые игры наподобие Kirby Air Ride стали чуть темнее.
В игру по-прежнему можно играть, если вы привыкли проходить её вслепую.
Почему такое происходит с Kirby Air Ride? Чтобы ответить на этот вопрос, нам нужно поговорить о LogicOps и о том, как они работают на GameCube/Wii. LogicOps (логические операции) — это чуть более сложная версия операций смешения (Blending), позволяющие игре выполнять широкий ассортимент двоичных команд на этапе смешения. GameCube и Wii поддерживают её нативно (на основе реализации OpenGL). В оборудовании они являются побитовыми операциями, использующими выходной цвет из TEV и/или текущий цвет из буфера кадров для применения их различными способами. Затем результат операции записывается в буфер кадров и используется.
Kirby Air Ride использует значение альфы из буфера кадров, чтобы определить, где рисовать тени на экране. В начале кадра игра задаёт альфу прямоугольника равной 255. Однако она также бесполезно применяет логическую операцию SET задающую выходной цвет равным текущему цвету TEV. Это нормально, если система поддерживает один из правильных путей LogicOp в Dolphin. Однако всё идёт совершенно не так, при аппроксимации LogicOps по пути смешения в Dolphin. В этом случае Dolphin задаёт коэффициенты источника и конечной цели для цвета, но не задаёт коэффициенты для альфы. Из-за этого альфа на весь кадр становится равной нулю. Даже когда игра пытается изменить значение, чтобы пометить, где должны рисоваться тени, оно остаётся равным нулю.
Если мы просто отключим LogicOps, всё покрывается тенью.
Если LogicOps эмулируются правильно, то все незатенённые части осветлены.
Если передавать чёрный вместо значения альфы, то вместо осветления сцены она оказывается погружённой в темноту. Эмулирование LogicOps при помощи смешивания уже было крайней мерой, поэтому чтобы улучшить ситуацию OatmealDome пришлось пойти по другому пути. В macOS с MoltenVK Metal не поддерживает LogicOps, поэтому OatmealDome немного изменил нашу реализацию MoltenVK, чтобы включить SPIRV-Cross, позволяющий преобразовать входные данные промежуточного прохода Vulkan в запрос к буферу кадров. Это позволяет GPU Apple Silicon поддерживать LogicOps, но, к сожалению, все остальные GPU macOS всё равно не работают, так как не поддерживают эту функцию. Для OpenGLES существует расширение для поддержки LogicOps, но, разумеется, его поддержка не реализована ни в одном мобильном драйвере. Вместо этого мы используем
GL_EXT_shader_framebuffer_fetch
или GL_ARM_shader_framebuffer_fetch
, которые могут дать нам цвета из буфера кадров, после чего мы сможем обработать логику LogicOps в самом шейдере. Это чуть медленнее, чем нативная поддержка, но гораздо лучше, чем аппроксимация при помощи смешения.И сказал OatmealDome: да будет свет!
Примечание: изменения в MoltenVK не будут подниматься вверх по потоку, потому что используемое поведение специфично к тому, что требуется Dolphin. Оно работает для наших задач, но есть вероятность, что другим программа оно не нужно. Со временем MoltenVK достаточно разовьётся, чтобы этот хак перестал быть нужным, но пока он помогает запустить игру на Apple Silicon.
5.0-15680 — TextureConverterShaderGen: установка альфы на 1 в форматах яркости, если в EFB отсутствует альфа, Pokechu22
Иногда малоизвестная игра может привести к очень интересным эффектам. Rygar: The Battle of Argus был портом выпущенной за шесть лет до этого игры для PS2 Rygar: The Legendary Adventure, которая стала продолжением Rygar (Arcade), запустить которую можно на Wii Virtual Console Arcade. Судя по оценкам, люди Rygar: The Battle of Argus считают лучшей игрой Rygar для Wii.
И это почти вся информация, которую мы смогли найти по этой игре. Однако вне зависимости от качества любая игра может стать примечательной для разработчиков эмуляции. Для этого ей достаточно иметь одну особенность, сбивающую с толку всех. В случае Rygar: The Battle of Argus эта особенность оказалась любопытной для нас всех. В отчёте об ошибке говорится, что некоторые экраны выглядят в Dolphin бледными, и эту проблему в конечном итоге можно свести к эффекту bloom. Поэкспериментировав с эффектом и с тем, как он работает, мы задались вопросом, работал ли он вообще на консоли. Однако это можно было легко протестировать и оказалось, что это был ещё один странный пограничный случай.
Эта тёмная и мрачная игра выглядит слишком блеклой.
Игра должна иметь гораздо более тёмный оттенок.
Pokechu22 заинтересовался этим, поэтому вы уже наверно догадались, что было дальше. Он предположил, что эта проблема может быть связана с другими визуальными глитчами в игре. После тестирования в последних тестовых версиях Pokechu22 выяснил, что этот баг в разной степени присутствовал в большинстве сцен игры.
Вместо того, чтобы пытаться разобраться, что же не так в Dolphin, он углубился в разбор того, как именно игра рендерит этот эффект. После того, как он разобрался с эффектом, стало понятно, что ошибка может быть очень простой. Оказалось, что bloom в игре использует хитрый трюк, чтобы обойти ограничения оборудования — GameCube и Wii могут работать только с одним буфером кадров. Если разработчик хочет выполнять другие вычисления при помощи GPU, например, создать текстуру для динамических теней, то ему понадобится выполнять отрисовку поверх того, что уже нарисовано на экране. Это похоже на проблемы и сложности, с которыми столкнулась Heavy Iron Studios при рендеринге теней в Spongebob Squarepants: The Battle for Bikini Bottom.
Чтобы не вдаваться в подробности, скажем, что поскольку игре нужно было рендерить поверх того, что уже было отрендерено, она создавала EFB Copy без альфа-канала. Из-за этого альфа-канал возвращал 1, или полную непрозрачность. Хотя обычно это правильно, Rygar создавал EFB copy из текстуры с форматом яркости. Обычные текстуры в качестве EFB copy как правило были равны 1, однако при использовании формата яркости Dolphin присваивал им значение нуля! Это совершенно меняло ситуацию с рендерингом Rygar: The Battle of Argus, и являлось главным аспектом достаточно интересной техники динамического bloom.
Rygar: The Battle of Argus
Как обычно, после нахождения уникальной проблемы Pokechu22 начал изучать fifologs и отчёты об ошибках, чтобы найти потенциально связанные с ней баги. Как ни странно, он наткнулся на гораздо более известную игру: Pokemon Battle Revolution! В течение последней пары лет она страдала от регрессии, которая заставляла экран сдвигаться, когда на нём был спецэффект, задействующий EFB.
Эта регрессия раздражала пользователей, так как во время большинства спецэффектов появлялась чёрная граница (справа и снизу).
К сожалению, у нас не было зацепок, позволяющих выявить причину, но в конечном итоге они и не потребовались. Исправление Rygar: The Battle of Argus также исправило и Pokemon Battle Revolution. Однако, поскольку никто не знал, почему исчезла проблема в Pokemon, работа была завершена не полностью. Как оказалось, причина заключалась в двух отдельных багах, один из которых происходил на консоли! Сильное смещение экрана было багом Dolphin, но многие спецэффекты в какой-то степени были сломаны и на консоли. Так происходило, потому что игра случайно обрезала самые нижний и правый строки пикселей, а из-за усечения текстур эти строки применялись для всего, что использовало контент за пределами экрана.
Pokechu22 обнаружил баг и создал патч для игры, благодаря чему множество спецэффектов начало рендериться так, как задумано изначально.
Вот как раньше была сломана игра в Dolphin.
А вот как она выглядит после устранения проблемы, точно соответствуя результату на консоли.
А вот как эффект задумывался изначально, баг в игре пропатчен.
И на этом исследование этих двух игр было завершено… А, впрочем, нет. Вскоре после изучения Rygar: The Battle of Argus было замечено, что игра больше не работает в последних тестовых сборках, вылетая с ошибкой backpatch, если не был включен полный MMU. Эта регрессия была устранена в 5.0-15699 и игра вернулась к обычной работе.
5.0-15928 — добавление системного онлайн-обновления Wii в Dolphin для Android, Simonx22 и OatmealDome
Ещё одна масштабная функция была добавлена в GUI Android. Если вы хотите включить расширенные функции Wii или запустить homebrew, необходимо наличие полного ассортимента System Files. На Android получить эти System Files может быть немного сложно, потому что обновление эмулируемой Wii выполнялось не так просто, как на десктопных версиях Dolphin. Simonx22 и OatmealDome объединили свои усилия для устранения этой проблемы: Simonx22 занялся работой со стороны Android, а OatmealDome помогал с реализацией на стороне C++.
Online Wii System Update выполняется через те же этапы, как и обновление на реальной Wii.
Но помните, что для этого используется Интернет! Учитывайте объём мобильного трафика!
После запуска Wii System Update вы сможете получить доступ к Wii Menu и запускать каналы, игры, а также такие вещи, как Open Homebrew Channel!
«Свежая» NAND Wii, запущенная на Android.
Для большинства пользователей это будет не особо важно, но это позволяет получить простой доступ к Wii Menu и запускать диски и каналы из него, без необходимости PC для скачивания или копирования файлов.
5.0-15931 — отключение всплывающего окна неизвестного опкода для 0x1-0x7, Pokechu22
Игроки в Mario Party 5 много лет жаловались нам на очень любопытный баг. «Почему Dolphin вылетает при использовании Wiggler Orb»?
Строго говоря, Dolphin не вылетал, а сообщал пользователю о неизвестном опкоде. Хоть это и прерывало игру, пользователю достаточно было закрыть окна сообщений, и игра продолжала работать, как будто ничего не случилось. За годы мы выяснили, что это событие безвредно и не вызывает проблем, но не хотели убирать сообщение. В конечном итоге, оно ведь было верным и указывало на вероятный баг в эмуляции GPU Dolphin.
Консоль здесь не зависает и не вылетает, так что это проблема только Dolphin, правда?
Однако мы не могли изучить вопрос подробнее, потому что Fifoplayer эмулятора Dolphin не мог записывать сцены с неизвестными опкодами. По крайней мере, до недавнего времени. Мы уже часто его упоминали, но, несмотря на свою занятость, Pokechu22 всё-таки нашёл время, чтобы дополнить Fifoplayer исправлениями и новыми функциями. Одним из последствий его исправления стало то, что Fifoplayer теперь может записывать сцены с неизвестными опкодами. Какие загадки, скрывавшиеся от нашего взгляда все эти годы, раскроет нам Wiggler Capsule? Чтобы узнать это, мы приведём собственную цитату Pokechu22.
По сути, анимация Wiggler capsule отрисовывает множество колец. В каждом кольце содержится 128 вершин, их позиции движутся по кругу, а координаты текстур на каждом горизонтальном шаге увеличиваются на 0,03125 (1/32). Данные позиции, цвета и координат текстуры для каждой вершины индексированы в несколько массивов, а первое множество из 4 вершин использует индексы 0, 1, 3 и 2. Однако после записи всех 128 вершин игра записывает данные ещё для 4 вершин, снова используя индексы 0, 1, 3 и 2. Но поскольку игра сообщила, что будет отрисовывать только 128 вершин, а не 132, эти 4 вершины интерпретируются как графические команды. Опкод 0 — это NOP, а тестирование на оборудовании показало, что опкоды 1-7 тоже обрабатываются как NOP, поэтому на реальном оборудовании они игнорируются, но Dolphin эти лишние данные не нравятся…
Изолировав отдельное кольцо от эффекта, мы можем увидеть, что проблема есть.
Если мы модифицируем данные FIFO, сообщив, что вершин на самом деле 132, то первая часть кольца отрисовывается дважды, и это показывает, что вершины 129-132 в обычном случае не используются.
Если мы принудительно отрендерим дополнительные вершины, то одна часть кольца становится ярче. Это значит, что на самом деле эти вершины не рендерятся.
И это подтвердило наличие довольно любопытной ситуации! Впервые за многие годы всплывающее окно «Unknown Opcode» действительно было вызвано неизвестным опкодом в розничной лицензионной игре. В большинстве случаев такие опкоды игнорируются как ошибочное поведение Dual Core или странные проблемы таймингов GPU. Вполне оправдано, что сообщение, написанное разработчиками больше десятка лет назад, похоже, игнорирует тот факт, что причиной всплывающего окна может быть действительно неизвестный опкод.
Это маловероятно, но всё же факт.
Как же разработчики игры упустили эту проблему? Мы предполагаем, что этот эффект программировался довольно бессистемно, и разработчики не понимали, насколько он поломан. Эффект поломан во многих аспектах, один из которых визуально отображается в виде дефекта текстуры. Хотя в обычной ситуации это было бы очень сложно увидеть на консоли, Pokechu22 придумал способ использования HW Fifoplayer (Fifoplayer, работающего на настоящей консоли) с хитрым склеиванием копий XFB, чтобы создать на консоли скриншоты высокого разрешения. Способ неидеален, однако он даёт нам возможность посмотреть в высоком качестве на то, как рендерится эффект на консоли и подтвердить, что Dolphin эмулирует его правильно.
Благодаря сложным техникам и куче склеек мы можем увидеть, что на консоли всё рендерится так же. Это баг игры!
После того, как мы полностью поняли проблемы игры и убедились, что опкоды 0x1 -> 0x7 являются NOP (No Operation), всплывающие окна Unknown Opcode были отключены для этих опкодов. Это значит, что в последних тестовых сборках вам не нужно беспокоиться о том, что Wiggler Capsule будет вызывать паузы в игре. Так как это странное поведение, Dolphin продолжит в фоновом режиме заносить Unknown Opcodes 0x1 -> 0x7 в лог, так как это может дать нам представление о другом плохом поведении и потенциальных визуальных проблемах.
5.0-15936 — Android: альтернативное управление инфракрасным указателем, lynxnb
lynxnb вернулся с ещё одним изменением для Android, на этот раз с альтернативной схемой управления для указателя в стиле сенсорного экрана. В настоящий момент в Dolphin игрок может управлять IR-указателем, касаясь экрана, после чего курсор перемещается приблизительно в ту точку, которой коснулся палец. Перемещение не особо точное, потому что игры калиброваны по-разному, а также это зависит от соотношения размера пальцев и целей на экране. Это изменение добавляет второй режим, в котором инфракрасный указатель следует не за позицией пальца, а за его движениями, как на сенсорном экране. Это особенно полезно в шутерах, где приходится часто поворачиваться.
5.0-15974 — Android — добавлена поддержка импорта/экспорта User Files, JosJuice
Оказалось, что ситуация с Scoped Storage на Android раздражает и сбивает с толку как пользователей, так и разработчиков. Работа и проблемы Scoped Storage сильно варьируются в зависимости от телефона, производителя и версии Android. Похоже, некоторые производители полностью блокируют определённые папки, не позволяя пользователям даже копировать файлы с десктопного компьютера. Это значит, что пользователи не могут копировать сохранения, настраивать моды Riivolution или создавать резервные копии данных. Учитывая довольно отчаянное положение, JosJuice решил быстро реализовать опцию, которая, по крайней мере, даст пользователям нечто, что можно использовать для импорта и экспорта пользовательских параметров.
В «Config/User Data» теперь есть опция импорта и экспорта User Data.
Стоит учесть, что мы не будем реализовывать собственный диспетчер файлов только для работы с пользовательскими параметрами. В настоящий момент Dolphin может импортировать файлы .zip, содержащие папку пользователя. Чтобы это считалось действительными пользовательскими данными, в папке «Config» должен присутствовать файл «Dolphin.ini». Нужно заметить, что импорт User Data перезапишет и удалит все имеющиеся User Data. При экспорте папки User Data она экспортируется в такой же файл zip, который Dolphin ожидает при импорте, поэтому можно использовать его, чтобы понять структуру файла zip. На данный момент поддержка реализована не полностью, поэтому чем «проще» сжатый файл zip, тем лучше. Мы продолжим исследовать другие возможности работы с User Data, понимая, что в дальнейшем это может быть проблемой.
5.0-15862 — улучшения уведомлений о панике, pokechu22
Эта переделка довольно сильно запоздала. По сути, система уведомлений о панике Dolphin имела некоторые незначительные баги. В частности, она не отображала всю информацию, которую мы хотели, а переводы не работали, то есть даже если некоторые уведомления о панике и переводились, переводы никогда не отображались вне зависимости от выбранного пользователем языка. Наряду с устранением всех описанных выше безумных графических багов pokechu22 нашёл время немного починить и уведомления.
В этом уведомлении о панике сообщается самый минимум, но его можно улучшить.
И теперь в последних сборках эти улучшения появились.
Портирование параметров в новую систему конфигураций, AdmiralCurtiss
Мы уже довольно долго не говорили о новой системе конфигураций. Честно говоря, сейчас она уже не особо новая. Этим летом ей исполнилось пять лет. Layered Configuration System (Layered Config) — это более мощная система конфигураций, обеспечивающая слои переопределений, не забывая при этом о различных параметрах. Layered Config — это оверлейная система конфигураций с несколькими слоями, и каждый слой накладывается на более низкий. Несмотря на то, что Dolphin работает только с окончательным результатом всех слоёв, в системе конфигураций каждый слой существует постоянно, позволяя Dolphin знать, на что и почему влияет каждый слой параметров. Это позволило пользователям вносить изменения на лету, без необходимости переопределять значения по умолчанию сразу после открытия меню. К сожалению, после того, как были портированы важные параметры, процесс переноса элементов в Layered Config замедлился и за последние пять лет появилось две активные системы конфигураций. Классическая, быстрая, но ограниченная SConfig и более новая, более надёжная, но иногда более сложная в оптимизации Layered Config.
Из-за того, что у Dolphin есть две очень отличающиеся системы конфигураций, возник небольшой технический долг, и это ограничило возможности Dolphin по развитию в определённых направлениях. Вам нужна кнопка «Вернуться к стандартным параметрам»? Ну, её создать не так просто, ведь существует две активные системы конфигураций. Хотите добавить определённый параметр в конфигурацию игры? Работа параметров SConfig в GameINI не гарантируется! Хотите изменить параметр, играя в Dolphin на Android? Если параметр обрабатывается SConfig, то есть вероятность, что вам сначала придётся остановить эмуляцию. И список проблем продолжается, однако чтобы переместить всё сразу, потребовалось бы достаточно много труда.
Последние месяцы AdmiralCurtiss наконец-то занялся удалением всех оставшихся зависимостей от SConfig и упрощением системы конфигураций Dolphin в целом. Конечной целью всего этого станут новые, более простые способы управления параметрами Dolphin, чтобы пользователям необязательно было становиться специалистами для работы с Dolphin. Но пока мы продолжаем портировать оставшиеся детали, готовясь к чему-то большему.
Redump сделал базу данных Wii публичной!
Хотя это изменение не напрямую связано с Dolphin, оно влияет на верификацию дисков. Верификатор дисков Dolphin теперь может верифицировать хорошие дампы игр для Wii при помощи базы данных redump.org для Wii. В сборках с функцией верификации дисков обратите внимание на то, что Dolphin теперь может сообщать, что вы используете хороший дамп игры для Wii. Это распространяется на сборки, созданные до публикации базы данных, так как такая функциональность готовилась к выпуску в будущем.
Наконец вы можете быть уверены, что используете хороший дамп игр для Wii.
macOS получила немного внимания
В течение нескольких последних лет macOS находилась в странном состоянии относительно Dolphin. Нам приходилось иметь дело с тем, что Apple отказывается от уже и так минимальной поддержки OpenGL, игнорирует Vulkan в пользу собственного графического API, а изменения Bluetooth в macOS 12 Monterey снизили возможность подключения реальных Wii Remotes с состояния «временами возможно в хороший день» до «ни малейшего шанса». Добавьте к этому строгие меры безопасности компании, и вам станет понятно, почему нам очень сложно обеспечить пользователям macOS удобство работы с Dolphin. Несмотря на нерешённость некоторых проблем, OatmealDome с несколькими другими разработчиками взяли на себя бремя обеспечения и обновления поддержки macOS в Dolphin. За последние три месяца было совершено два существенных шага в контексте этой ОС.
Наверно, кому-то стоило это проверять
Под macOS наша официальная минимально поддерживаемая версия — это macOS 10.13 High Sierra. У нас есть система с High Sierra для верификации, однако после недавнего перехода к новым Universal Builds, мы так и не добрались до тестирования этих сборок на машине с High Sierra. Разумеется, машины с Intel тестировались, но мы никогда не касались тех, на которых установлены более старые версии macOS. Так как Universal Binaries работают на всём вплоть до macOS 10.4.4 Tiger, мы не беспокоились об этом.
Шесть месяцев спустя внедрения Universal Builds и два месяца спустя после отключения mac-сборщика только для систем с Intel мы получили отчёт об ошибке: версию для macOS невозможно было запустить на системе с macOS 10.14 Mojave. Мы могли отреагировать на это только одним способом. Покопавшись на полках и протерев пыль, мы достали систему с High Sierra и наконец проверили на ней новые Universal Builds. Они не работали. Мы сразу решили, что причина в Qt, ведь именно из-за него мы сделали минимальным требованием High Sierra, но Qt был не виноват. TellowKrinkle выяснил, что универсальный сборщик был настроен с новой версией SDL, имевшей минимальную поддержку macOS 11, которой исполнился год. Для нас это было совершенно неприемлемо! К счастью, после обнаружения этой проблемы её оказалось довольно просто решить, и теперь последние сборки Dolphin снова работают в High Sierra.
MacBook Pro 2012 года с запущенным Dolphin 2022 года! Почти все свои десять лет этот почтенный ноутбук посвятил обслуживанию Dolphin, поначалу на нём программировали, затем в течение пяти лет писали блоги Dolphin, а теперь он помогает сохранять границы поддержки macOS. В течение многих лет это было единственное устройство для тестирования под macOS. Наверно, этот MacBook помог Dolphin больше, чем какая-либо другая машина, и мы надеемся, что так будет ещё много лет.
Пресловутая проверка
Наши сборки для macOS подписывались многие годы, поэтому постепенно усиливающаяся хватка Gatekeeper нас не волновала. Так было до macOS 10.14.5, когда было включено требование о проверке. Теперь подписывания приложения было недостаточно, разработчики под macOS должны отправлять копию своих сборок Apple, чтобы сама компания сканировала их на наличие вредоносных программ и верифицировала ключ подписи. Мы без энтузиазма отнеслись к этим новым строгим требованиям. Они конфликтовали с нашими системами ботов сборок того времени, и такую процедуру было сложно реализовать, поэтому мейнтейнер решил от неё отказаться. К счастью для наших пользователей, это означало, что Gatekeeper теперь обращался с нашими сборками так, как будто они не были подписаны.
Поэтому в течение последних двух лет пользователи не могли просто дважды щёлкнуть, чтобы открыть новые сборки Dolphin. Gatekeeper жаловался на это, сообщая, что он не уверен в их безопасности и отказывался загружать Dolphin. Чтобы обойти эту проблему, пользователям нужно было зажать Ctrl при нажатии на Dolphin, а затем нажать Open и снова нажать на Open в открывшемся диалоговом окне. Затем Dolphin открывался… или диалоговое окно закрывалось и пользователю нужно было дважды нажать на Dolphin. Если кто-то знает, почему так иногда случается, дайте нам знать, из-за этой особенности объяснение процесса для новых пользователей превратилось в настоящий кошмар.
Каждый пользователь Dolphin под macOS видел этот экран очень много раз.
Несмотря на прошлые проблемы, OatmealDome избавился от основных проблем с проверкой и был собран новый универсальный бот сборок. Теперь новые сборки будут работать в macOS без всех этих раздражающих всплывающих окон и обходных путей. Достаточно просто дважды щёлкнуть на Dolphin, и он заработает, как удобно!