Dolphin, январь 2015: рабочий Rogue Squadron, разгон ЦП GC/Wii, реализация zfreeze, увеличение скорости

.fez {width:640px;} .pict {text-align:center; margin-left:10px; margin-bottom:8px; padding-bottom:8px; padding-top:12px; width:250px; float:right; font-style:italic;} .cnt {text-align:center;} .left {padding-top:3px; padding-right:5px;} .topleft {padding-top:8px; padding-right:5px; text-align:right; vertical-align:top;} .pictw {text-align:center; margin-left:10px; margin-bottom:8px; padding-bottom:8px; padding-top:12px; color:#444444; width:280px; float:right; font-style:italic; } .pad {padding-top:4px; text-align:center; } Казалось, еще недавно мы отмечали новый год – а тут уже и январь миновал. Да, быстро летит время. Ну, а разработчики Dolphin вновь радуют нас привычным отчетом о проделанной работе. Его перевод приводится ниже.

В январе Dolphin наконец сможет дать внятный ответ на вопрос, который пользователи все время задают после выхода каждого отчета: «А Rogue Squadron уже заработал?»

Благодаря огромному количеству проделанной работы, всевозможным тестированиям, усилиям новых и старых разработчиков, игры Star Wars Rogue Squadron II: Rogue Leader и Star Wars Rogue Squadron III: Rebel Strike стали полностью рабочими и проходимыми.

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

Ускорение MMU (часть 2)

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

Последние два месяца разработчики постоянно занимались этой проблемой, намереваясь по максимуму снизить ресурсоемкость MMU. Несмотря на то, что MMU используется многими играми, разработчики вознамерились добиться полной скорости эмуляции Rogue Squadron II/III на существующих ПК, еще до того, как эти игры стали бы рабочими.

Многие изменения основывались на двух простых принципах: на устранении влияния MMU на тот код игры, который его не использует, и на сокращении пути преобразования адреса – начиная с загрузок и сохранений в память, и заканчивая соответствующим поиском по таблицам страниц. Сначала разработчик skidau исправил работу Block-Linking в MMU, после чего magumagu реализовал в нем fastmem.

Затем Fiora старательно собрала почти два десятка патчей для MMU – они добавили в эмулятор оптимизированные парные загрузки и сохранения, проверки исключений и поиск в буфере быстрого преобразования адреса, – и одновременно исправила некоторые баги, приводившие к случайным зависаниям в играх с MMU.

В целом, благодаря всем исправлениям Fiora, скорость эмуляции игр серии Rogue Squadron увеличилась на 80%; прочие игры с MMU тоже получили значительную прибавку в производительности. Если в расчет взять улучшения magumagu и skidau, то некоторые MMU игры стали работать почти в два раза быстрее, чем месяц назад!
 


Успехи, касающиеся скорости эмуляции MMU, также подтолкнули magumagu начать масштабную и необходимую работу над унификацией и исправлением механизма управления памяти в Dolphin – вполне возможно, что в результате этого заработают игры Cars 2 и Disney Infinity.

Поддержка произвольной частоты эмулируемого ЦП

Данное изменение обсуждается вот уже как несколько месяцев. Если изменить частоту процессоров GameCube/Wii, то это может следующим образом повлиять на игры:

Первоначальная цель
  • Непостоянная частота кадров в играх: некоторые игры, такие как The Sims, Gauntlet Dark Legacy, Spyro the Dragon: Enter The Dragon Fly, Crash Bandicoot: Wrath of Cortex, The Last Story и другие, работают на различной кадровой частоте. В зависимости от нагрузки на ЦП, они могут переключаться между 20, 30 и даже 60 кадрами в секунду. За счет увеличения производительности процессоров GameCube/Wii, Dolphin теперь может все время эмулировать эти игры с максимально возможной частотой кадров.
     

    Большинство игр, работающих на частоте 30 к/с, имеют фиксированное ограничение: без некого специального патча/хака они не будут работать на более высокой частоте, даже если разогнать ЦП на 400%.
Новое найденное применение
  • Проблемы с точностью циклов: Dolphin не эмулирует GameCube/Wii с точностью до цикла, поэтому игре порой может не хватать точности эмуляции ЦП. В некоторых играх видеоролики зависят от точности IPC (числа команд за один такт), как, например, промо-ролики в The Legend of Zelda: Ocarina of Time (Master Quest). Повышая или понижая частоту процессора, пользователи могут устранить зависания, вызванные неточной эмуляцией скорости ЦП. В будущем эмуляция ЦП будет улучшена и эти хаки для правильной работы игры больше не понадобятся. В общем-то, уже сейчас есть соответствующие планы. Понижение частоты даже помогает устранить некоторые странные глюки, (например, мигающее солнце в режиме DualCore в игре The Legend of Zelda: The Wind Waker).
  • Спидхак: в некоторых играх данная функция может использоваться для повышения скорости эмуляции. С уменьшением частоты процессора уменьшается и требование к ресурсам ПК, и, как следствие, исчезают просадки в скорости эмуляции. Несмотря на то, что сами игры могут работать хуже (либо менее плавно, либо медленней), такая эмуляция может быть предпочтительней, чем заедание звука, вызванное нехваткой мощности компьютера.
     
Разрешить блокировке L1 DMA запись в EFB

Это относительно автономное изменение, и, тем не менее, о нем нужно упомянуть, так как благодаря ему несколько игр начали правильно загружаться. Некоторые игры, основанные на персонажах Nickelodeon, использовали этот специфичный метод для отрисовки мультяшных видеороликов. Поскольку Dolphin его не эмулировал, они, соответственно, не работали. Теперь все будет работать как и положено, но из-за того, что EFB Pokes на данный момент эмулируются медленно, пользователям, для увеличения скорости, следует ее отключить, включив опцию Skip EFB Access to CPU.

Когда Dolphin сможет записывать за один проход больше одного пикселя, эти видеоролики будут эмулироваться в полную скорость: осталось лишь реализовать эту функции.

Текстурный пул

Год назад разработчик degasus реализовал потрясающую особенность, именуемую текстурным пулом. Текстурный пул – это кэш для неиспользуемых текстурных объектов. Выделение и освобождение места для этих ресурсов – дело не из легких, особенно в режиме OpenGL. Многие могли заметить, что эффекты преломления, например, в играх серии Metroid Prime, просто клали OpenGL на лопатки, в то время как D3D едва ли напрягался.

В прошлом, если запись в текстурном кэше не совпадала, Dolphin ее удалял и создавал новую. При использовании текстурного пула, Dolphin ее не удаляет, а переносит в пул. И вместо создания новой записи, он сначала сверяется с пулом на предмет наличия в нем требуемой текстуры. Текстурный пул дал колоссальную прибавку в скорости в тех игра, которые страдали от соответствующего ограничения.

К сожалению, из-за неисправленных проблем в коде, текстурный пул вызывал вылеты и другие проблемы, поэтому его, несмотря на весь потенциал и увеличение скорости, пришлось удалить. Теперь, после всех требуемых процедур и работ, улучшенный текстурный пул снова возвращается в строй. В некоторых играх он дает просто колоссальное ускорение, например, в Harvest Moon: A Wonderful Life в ночных сценах скорость может возрастать почти в одинадцать раз!
 

В прочих играх увеличение будет гораздо скромней. В играх Metroid Prime значительно улучшается скорость работы многих спецэффектов. Похоже, что почти каждая игра получает выгоду от более эффективного текстурного пула: скорость работы повышается в среднем на 5-15%.

Рекомпилятор загрузчика вершин X86-64

Загрузчик вершин Dolphin’а был одним из ограничивающих факторов, который мог быть устранен без особых сложностей. Fiora получила значительное увеличение производительности несколько месяцев назад, реализовав ряд простых оптимизаций в загрузчике вершин, но рекомпилятор загрузчика все равно оставался примитивным. Ни для кого не было секретом, что для получения идеальной производительности его надо было должным образом переписать.

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

Он эффективней конвертирует вершины, выдаваемые эмулируемым ГП, в формат, удобоваримый для видеокарты ПК – как следствие, падает нагрузка на ЦП. Степень ее уменьшения зависит от того, насколько игра была ограничена вершинным загрузчиком. В некоторых локациях Rogue Squadron II, игра может работать вполовину быстрее (например, в доках с космическими кораблями, где каждый корабль состоит из 10 тысяч полигонов).
 

Есть одна загвоздка: рекомпилятор загрузчика вершин использует инструкции SSSE3, поэтому увеличение скорости эмуляции увидят лишь те, кто обладает соответствующими процессорами (у Intel – процессоры Core 2 и выше, у AMD – Bulldozer и выше).

Эмуляция клавиатуры GameCube

Название говорит само за себя. Пользователи могут настроить клавиатуру и использовать ее в тех играх и хомбрю, которые поддерживают соответствующий аксессуар, например, в Phantasy Star Online. Теперь Dolphin эмулирует еще один клевый, но бестолковый прибамбас для GameСube. К сожалению, адаптеры GameCube Controller не будут работать с реальной клавиатурой от GameCube, так как они не передают информацию с последовательного порта напрямую.
 

Небольшое исправление текстурных палитр в режиме EFB Copies to Texture

Иногда при исследовании кода можно найти забавные мелкие проблемы. В нашем случае разработчик mimimi узнал, что текстурный кэш для текстурных палит был совершенно нерабочим. На практике это означало, что при использовании режима EFB Copies to Texture на экране возникала каша. В режиме EFB Copies to Ram текстурный кэш должен быть отключен, в противном случае текстуры не будут получать команду на обновление.

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

Twilight Princess, EFB to Texture, до

Twilight Princess, EFB to Texture, после

Rogue Squadron II, EFB to Texture, до

Rogue Squadron II, EFB to Texture, после

Twilight Princess, EFB to RAM, правильная эмуляция

Rogue Squadron II, EFB to RAM, правильная эмуляция

Но это еще не все: после внесения исправления в принцип работы с текстурными палитрами, режим EFB Copies to RAM больше не требует включение опции safe texture cache для работы с текстурными палитрами! К сожалению, это не полноценное решение проблемы: оно всего лишь повторно интерпретирует EFB copy в качестве текстурной палитры, поэтому в режиме EFB Copies to Texture ломается игра Dragon Ball Z: Budokai Tenkaichi 3.

Исправление в работе освещения

Код Dolpin’а, отвечающий за модель освещения, является не самой светлой стороной эмулятора. Она настолько сложна, что предыдущие попытки выяснить принцип ее работы &nash; путем сравнения работы эмулятора и реальной приставки &nash; отбили у разработчиков всякое желание ею заниматься. Относительно новый программист NanoByte011 об этом совершенно ничего не знал, и в итоге он исправил многие странные проблемы с освещением, а также переделал код, отвечающий за затухание освещения.
 

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

Улучшение работы с пользовательскими текстурами

Многие пользователи даже и не подозревают, что Dolphin может извлекать текстуры из игр; что их затем можно модифицировать и загрузить обратно в игру через опцию «load custom textures». Таким образом, пользователи могут создавать различные текстуры, но в основном эту возможность используют для создания наборов текстур повышенного разрешения. Благодаря им Dolphin может значительно улучшить графическую составляющую конкретной игры.
 
Текстурные палитры размножаются почкованием
Одним из самых больших наборов текстур на данный момент является набор для игры Xenoblade Chronicles. Несмотря на то, что данный набор – огромное произведение искусства, его создатели испытывали ряд проблем. В частности, Dolphin совершенно безобразно работал с текстурными палитрами: порой одна текстура имела тысячу одинаковых копий, и чтобы наборы HD текстур работали как следует, приходилось заменять все эти тысячи копий. Изменение разработчика degasus положило конец этой проблеме; он также привнес ряд новых улучшений, облегчающих создание и использование наборов текстур. Будем надеяться, что благодаря этим изменениям в будущем появится еще больше наборов текстур.

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

Эмуляция zfreeze в аппаратных видеорежимах

Zfreeze – это особенная функция ГП GameCube/Wii, которая не имеет аналогов в современных компьютерных видеоускорителях. Она может «примораживать» значение глубины у полигонов к произвольной опорной плоскости. Первоначально данная функция должна была использоваться для решения проблемы с z-fighting, но в итоге разные игры использовали ее самым различным образом. На первый взгляд может показаться, что ее эмуляция не должна составить проблемы, но это не так. Скудные возможности по изучению и пониманию этой функции, а также ограничения самого Dolphin'а в работе с режимами OpenGL и D3D, превратили даже простые попытки найти теоретическое решение проблемы в сущий кошмар.

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

Первый частичный успех был достигнут разработчиком neobrain в 2012 году. Его ветка эмулятора с zfreeze могла в некоторых случаях прорисовать текстуру неба в Rogue Leaders, но все попытки исправить другие игры сразу же ломали Rogue Squadron II. Он отложил свою работу на неопределенное время, чтобы провести тесты на приставке, но он так никогда ими и не занялся, а впоследствии он и вовсе потерял интерес к эмуляции zfreeze.

И хоть его ветка эмулятора осталась в прошлом, желание пользователей Dolphin поиграть в Rogue Squadron II (и Rogue Squadron III, когда он стал запускаться) никуда не делось. После выхода каждого отчета, самым популярным вопросом был «А Rogue Squadron уже заработал?». В итоге разработчик phire придумал хак, который по крайней мере позволял играм серии Rogue Squadron правильно работать с zfreeze. В жертву приносилась совместимость с другими играми с zfreeze, поэтому никто даже не рассматривал возможность переноса хака в основную ветку. И, тем не менее, он посеял зерно любопытства.

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

Решение проблемы zfighting на деколях

Используется в играх: Mario Power Tennis, Super Mario Strikers
 

До

После

Zfreeze создавался для решения проблемы zfighting при отрисовке деколей, в противовес использованию прочих хаков, вроде функции OpenGL «glPolygonOffset()», но разработчики почти никогда не использовали zfreeze в таком качестве. Phire полагает, что это слишком затратно, поскольку zfreeze требует новый drawcall для каждого набора деколей на разном треугольнике, и разработчики вместо этого просто вручную задают смещение вершин.

На основе fifo-логов нам известно, что лишь две игры (Mario Tennis и Mario Strikers) используют zfreeze по его назначению. В Mario Strikers эта функция используется для отрисовки теней на поле, в то время как в Mario Tennis она используется для отрисовки линий на теннисном корте. Но Mario Tennis также использует zfreeze хитроумным образом для отрисовки теней, поэтому Super Mario Strikers является единственной игрой, которая использует эту функцию только по ее назначению.

Подмена глубины (Depth Override)

Используется в играх: Rogue Squadron II/III, Mario Golf: Toadstool Tour, Blood Omen 2: Legacy of Kain
 

До

После

Самое известное использование – в играх Rogue Squadron, для отрисовки текстуры неба; она отрисовывается вблизи игрока, а zfreeze используется для подмены глубины и отрисовки текстуры позади всех объектов на zfar-поверхности. Почти такой же результат можно получить, если во фрагментном шейдере указать глубину «depth = 1.0», только GameCube делает это на этапе расчета треугольников, когда происходит ранний z culling. Разработчики из Factor 5 использовали этот метод потому, что если бы они разместили текстуру неба вдали, она бы занимала огромный участок zbuffer (так как Factor 5 использовали аппаратное сглаживание, они были ограничены 16-битным zbuffer).

Прочие игры, использующие подмену глубины, делают это непонятно для чего. Игра Mario Golf: Toadstool Tour, скорей всего, разрабатывалась теми же программистами, что и Mario Power Tennis, и именно поэтому она ее и использует. Но она используется лишь в главном меню. С другой стороны, Legacy of Kain: Blood Omen 2 использует ее не только для текстуры неба, как Rogue Squadron II/III, но и для отрисовки меню паузы, как Mario Golf. Эта особенность полностью похоронила планы по созданию хаков под каждую игру: стало понятно, что zfreeze нужно реализовывать полноценным образом.

Трафаретные тени (Stencil Shadows)

Используется в играх: Большинство игр EA Sports, некоторые гоночные игры от EA, Mario Power Tennis и некоторые другие
 

До

После

Тени – один из самых сложных аспектов трехмерной графики: за последние годы были разработаны многие методы для отрисовки динамических теней, при этом каждый из них обладал своими плюсами и минусами. Выбор метода отрисовки теней зависит от аппаратных возможностей и аппаратной производительности. Известные трафаретные объемные тени Doom 3 дают самые резкие тени, но современные устройства не оптимизированы для работы с ними.

Игры EA Sports используют чистые проекционные тени: силуэт объекта проецируется на поверхность в программном режиме, – что не составляет трудностей, поскольку в спортивных играх поверхность совершенно ровная – после чего тень отрисовывается на поверхности. Если разработчикам нужны полностью черные тени, то это отличный выход, но в основном им нужны альфа-тени, чтобы избежать проблемы zfighting и чтобы полигоны, при наложении, затенялись дважды.

Но у GameCube отсутствует трафаретный буфер под такие ситуации. Вместо этого такие игры активируют zfreeze: благодаря ему каждый пиксель на экране всегда будет иметь идентичную глубину в zbuffer, если он будет отрисован дважды. Затем zfreeze меняет метод сравнения глубины с привычного «меньше, чем или равен» на «меньше чем», чтобы каждый пиксель тени отрисовывался лишь один раз. Это, по сути, создает однобитный трафаретный буфер в буфере глубины.

Решаем проблемы

Учитывая все это, не представлялось возможным создать единый хак, который работал бы с каждой игрой, а некоторые игры вообще нельзя было исправить, потому что они использовали разные методы с zfreeze. Максимум, чего бы добились хаки – это частичной поддержки этой функции. Однако Phire продолжал надеяться, что реализация правильной эмуляции zfreeze все-таки возможна, поэтому работая над хаками в основной ветке эмулятора, он продолжал искать пути реализации данной функции.

Neobrain, совершенно не поддерживавший идею с хаками, изложил планы касаемо того, как решить проблему с zfreeze, но при этом не использовать хаки под каждую игру. Ему было известно о предыдущих неудавшихся реализациях zfreeze, и он знал, что самое важное – понять принцип работы zfreeze. Однако никакие планы и усилия не могут учесть интуитивную прозорливость.

Разработчик NanoByte011, пытаясь хоть как-то реализовать zfreeze, портировал старую ветку neobrain’a с zfreeze и послал запрос на ее объединение с основной. Несмотря на то, что она уже ранее тестировалась, phire к своему глубочайшему удивлению обнаружил, что в этой ветке эмулятора в играх EA кое-как отображались тени. Он сразу начал использовать эту версию как основу для поиска решения.

В современном Dolphin’e ветка с zfreeze получила больший потенциал для реализации этой функции. phire и NanoByte011, опираясь на данную версию, начали вместе работать над zfreeze; они решали одну неразрешимую проблему, за другой. Разработчик Nanobyte нанес последний смертельный удар по тайне zfreeze, когда он решил проблему zfighting в игре Mario Power Tennis. После того, как EarlyZ был учтен, все проблемы с zfreeze канули в лету.

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

Perspective Divide Line-width Coordinates Before Comparing Angle

Игры от студии Factor 5 болезненно реагируют на все баги эмуляции. Разработчик Armada, переписав в прошлый раз line-width, смог исправить в OpenGL почти все игры, использующие данную функцию.

Исключение составляли, естественно, игры серии Star Wars Rogue Squadron. По непонятной причине, даже после всех тестов на приставке и прочей работы над устранением ошибок, эти игры все равно оказывались поломанными. Многие line-width объекты, в том числе и модели оружия и буксирные кабели, частично не прорисовывали линии, в зависимости от угла расположения объекта по отношению к камере. Но поскольку данное изменение было произведено в последнюю минуту, оно не попало в видеоролик, расположенный вверху статьи.
 

До

После

Оказалось, что проблема лежала в оригинальном коде для D3D, в котором эта функция была впервые реализована. В результате были исправлены не только игры Star Wars Rogue Squadron II и III, но и некоторые другие, например, Star Fox Assault. Правда, в этой игре разница практически не заметна невооруженным глазом.
+4

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

  1. metalslayer
    metalslayer от 5 февраля 2015 21:47
    Приятно читать такие новости, спасибо сайту за перевод.
  2. saxalin
    saxalin от 6 февраля 2015 07:11
    Низкий поклон тем кто это все писал! и переводил smile ну а еще молодцы Дольпийцы.
  3. centaur1982
    centaur1982 от 6 февраля 2015 16:22
    BLOODY ROAR®: PRIMAL FURY  - есть в GPU ошибки на NVIDIA .
    Ну а
    Star Wars Rogue Squadron II: Rogue Leader
    Star Wars Rogue Squadron III: Rebel Strike 
    это вообще революция!  так как эти 2 игры 10 лет не могли с эмулировать  правильно.
    Казалось все надежды на новый API DX12  ) для Star Wars Rogue , но нет же все сделали потом и трудом ! ,  молодцы разработчики.

    Star Wars Rogue самая лучшая игра , мечтал о том когда нибудь с эмулируют ее) .

    DX12 не куда не делся в будущем она даст фору OpenGL   в эмулятор Dolphin .
  4. demikraw
    demikraw от 14 февраля 2015 03:17
    Самое смешное, что сейчас в ПЕРВЫЙ эскадрон ни на эмуляторе ни на современной системе комфортно не поиграть. Только на старых виндах (иначе камера будет дико выеживаться) либо на железной Н64 sad
  5. centaur1982
    centaur1982 от 15 февраля 2015 23:44
    пока почистили MMU текстуры , zfreeze и прочии недостатки и еще предстоит  убрать не пропорциональный экран 4:3 в игра Star Wars Rogue Squadron 1 и 2 частях , а уж потом оптимизация и скорость .
Добавить комментарий

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