Dolphin, ноябрь 2014: улучшения ARM Android, повышение скорости и точности

.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;} Миновал последний месяц осени, а это значит, что снова настала пора разработчикам подвести итоги месячной работы.

Ввиду специфики работы над эмулятором, его функционал редко когда бывает доделан в полной мере. Например, в прошлом месяце разработчик crudelios разработал новый метод программной эмуляции Bounding Box. С легкостью можно сказать, что реализация этой функции стала самой точной за все время ее эмулирования. Несколькими месяцами до этого magumagu создал более точные дисковые тайминги, благодаря чему загрузка игр стала более точной. RachelBryk вот уже на протяжении многих лет стабильно добавляет новые возможности для любителей TAS (быстрых прохождений игр). Наверное, еще больше времени Sonicadvance1 потратил на свой глобальный проект, который не прекращает получать обновления – разработку порта Dolphin для архитектуры ARM.

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

Изменения для архитектуры ARM V7: повторная активация кэша регистров с плавающей запятой, переделка ARM Fastmem, огромное количество оптимизаций

Внимание всем, кто заинтересован в значительном увеличением скорости работы Dolphin на ОС Android и архитектуре ARM – эта новость для вас! Благодаря исправлению кэша регистров с плавающей запятой, эмуляция получила значительную прибавку в производительности!

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

В сумме все улучшения (в отчете упомянуты не все изменения) прилично ускоряют работу Dolphin на ARM-процессорах. Несмотря на то, что определение производительности на устройствах Android/ARM – задача не из легких (всему виной разнообразие драйверов), тестирование показало, что прибавка составляет порядка 20%.

Sonicadvance1 на своем устройстве с NVIDIA K1 Jetson теперь иногда получает полную скорость эмуляции на уровне «Аэропорт» в игре Super Mario Sunshine, и полную скорость с запасом на секретных уровнях.
 
Super Mario Sunshine


Прочие пользователи с планшетами NVIDIA Shield обнаружили, что некоторые игры оказались даже вполне играбельными. В их число попали и некоторые игры для Wii, поддерживающие джойстик от GameCube.
 
Pikmin 2



Bleach: Versus Crusade (Wii)


Многие надеялись, что устройство Nexus 9, комплектующееся NVIDIA K1 Denver, станет первыми Android-устройством, которое сможет эмулировать некоторые игры в полную скорость. В руки Sonicadvance1 попал один из таких экземпляров, и он провел предварительное тестирование. К сожалению, пока это еще не так. По результатам предварительных бенчмарков, производительность Nexus 9 либо равняется, либо немного отстает от планшета NVIDIA Shield. Но не стоит расстраиваться: Sonicadvance1 надеется, что благодаря оптимизации и совершенствованию AArch64 рекомпилятора, Dolphin сможет воспользоваться потенциалом этих устройств.

Поддержка контролера Nunchuck в TAS

Благодаря поддержке TAS в Dolphin игроки могут записывать ввод управления, сэйвстейты и производить покадровую перемотку. Обычно большинство пользователей используют сэйвстейты лишь как дополнительное сохранение перед сложным игровым участком, а запись ввода управления – чтобы сохранить любимые матчи в Super Smash Bros. Melee и не записывать огромные видеоролики.

Но любители скоростных прохождений и искатели глюков порой нуждаются в иных, более важных возможностях. Одной из них является функция «TAS Input»: с ее помощью можно задать вручную определенный градус наклона джойстика и во время воспроизведения записанных команд управления отображать их на экране. RachelBryk's реализовал поддержку Nunchuck, и теперь игроки могут испытывать на прочность игры, требующие этот контролер.
 

Исправление переполнения FIFO

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

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

GameCube и Wii – это, по сути, приставки с одноядерным ЦП, в которых ЦП и ГП идеально синхронизированы и работают в известных рамках. Так как эти факторы контролируемы, ЦП подает графические команды ГП предсказуемым и точным образом. Но при работе в режиме Dual Core, эмулятору приходится заставлять взаимодействовать вместе различные ЦП и ГП. Мало того что эти ЦП и ГП, в отличие от GC/WII, работают на разных частотах и могут сочетаться по-разному, их потоки выполняются разными ядрами. Чтобы контролировать эти факторы и поддерживать работу потоков в определенных рамках, Dolphin задействует функцию FIFO. Чтобы лучше понять принцип ее работы, представим себе кольцо-буфер, в котором два потока, ЦП и ГП, постоянно совершают в нем полные обороты, словно машины на гоночной трассе. Dolphin должен сделать так, чтобы потоки ЦП и ГП стартовали примерно в одно и то же время, даже несмотря на то, что оба потока работают на разных скоростях, а поток ГП работает настолько быстро, насколько это позволяет графический процессор.

Поток ЦП всегда немного опережает поток ГП

Но если поток ЦП значительно обгоняет поток ГП – происходит всякое нехорошее

А если поток ГП обгоняет поток ЦП – мир делится на ноль жди беды

Если бы разработчики не обращали внимания на производительность, то тогда проблема решалась бы работой в одноядерном режиме, при этом проводились бы проверки для поддержания идеальной синхронизации. Но перед Dolphin стоит цель достичь максимальной производительности при точной эмуляции. Поскольку практически все игры весьма вольно обращаются с таймингами ЦП и ГП, Dolphin использует это окно для значительного увеличения производительности, в частности в режиме Dual Core. Но скорость не играет никакой роли, если эмулятор постоянно вылетает. Любое изменение FIFO может вызвать серьезные последствия (вроде вылетов), именно поэтому все разработчики крайне осторожно трогают эту часть кода.

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

Skidau взялся за малоприятную задачу копания в коде FIFO. Выдвигалось множество идей, строились целые теории, как исправить баг. От постоянных неудач постепенно начала расти растерянность.

В итоге решение оказалось намного проще, чем ожидалось. По непонятной причине, изменения в таймингах EXI выявили ошибку, при которой поток ГП недостаточно часто сигналил потоку ЦП о приближении к переполнению. Когда сигнал о прекращении передачи данных таки доходил до потока ЦП, поток ГП уже был переполнен и выдавал сообщение об ошибке.

Skidau уменьшил задержку, увеличив частоту прерываний процессорных команд. В качестве награды за свои труды Skidau не только исправил вылеты, но и повысил стабильность в играх, имевших проблемы с FIFO и ранее, – в частности в The Last Story.

OpenGL: реализация Bounding Box через аппаратную эмуляцию

В прошлом месяце crudelios совершил революцию в эмуляции bounding box, реализовав ее на программном уровне. В этом месяце degasus улучшил ее, реализовав аппаратную эмуляцию bounding box в режиме OpenGL. Теперь OpenGL имеет все преимущества программной эмуляции данного эффекта и приятное дополнение: возможность переложить ее вычисление на видеокарту.

Мало того что данная реализация обеспечивает большую точность, чем программный вариант, она также влияет и на производительность:
 

Надо отметить, что новые видеокарты работают с этой функцией гораздо быстрей, чем старые карточки.

Как и в случае с масштабированием XFB, о котором рассказывалось в предыдущие месяцы, объемы знаний OpenGL и D3D у разработчиков разнятся, и эта функция не в полной мере реализована – в том плане, что сейчас ее поддерживает лишь режим OpenGL. Поэтому пока в D3D она работает через программный режим.

Поддержка постоянной угловой скорости чтения дисков (CAV)


За один оборот диска с его внешней окружности можно считать больше информации, чем со внутренней
С первого взгляда данное изменение может показаться излишним. Приводы GameCube/Wii при чтении информации с диска работают в режиме постоянной угловой скорости. Независимо от места чтения диска, привод крутит диск с постоянной скоростью.

Так как внешняя часть диска имеет большую линейную длину, чем внутренняя, при движении лазера к краю диска количество считываемых секторов увеличивается пропорционально. В основном это не играет важной роли: большинство приводов Wii и GameCube так сильно различаются, что предыдущее улучшение magumagu, disc seek accuracy, практически полностью исправило ошибки, связанные со скоростью чтения диска.

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

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

Слева: точный дисковый тайминг, справа: активирован Speed up Disc Transfer Rate

Вся проблема заключалась в том, что Dolphin считывал данные на скорости 3 000КБ/с – что ниже максимальной скорости чтения дисков привода Wii. Понизить скорость считывания не представлялось возможным, так как это привнесло бы заедания в игры, полагающиеся на видеоролики, такие как Gauntlet: Dark Legacy и Mario Golf: Toadstool Tour: в них ролики располагаются ближе к краю диска. Единственный выход заключался в реализации постоянной угловой скорости чтения.

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

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

В начале диска скорость считывания будет небольшой

По мере продвижения к краю диска, скорость должным образом возрастает

Пока производился тест, возник вопрос: можно ли с ее помощью снять образ диска на Dolphin, а потом запустить его на эмуляторе? Естественно, это нужно было проверить.
 

Любители сетевой игры сразу узнают эту контрольную сумму. Если образ снялся правильно...

Образ, снятый на эмуляторе Dolphin, может на нем же и запускаться! Dolphin породил парадокс!

Помимо этого, JosJuice также добавил небольшую задержку (~0.067ms) во многие DVD-команды. В результате в игре Starfox Adventures снова начали отображаться субтитры, а Sonic Riders больше не требует включения опции «Fast Disc Speed» для предотвращения вылетов. Так или иначе, но это огромный плюс в плане точности эмуляции.

Более векторизованная загрузка вершин

Вершинный загрузчик Dolphin – один из ключевых элементов работы ГП. Без него ГП компьютера, на котором запускается эмулятор, не будет понимать ни одну команду Wii/GC загружать вершины (включает в себя информацию о координатах точек и текстур, информацию о нормалях и цвете). Все эти команды должны быть преобразованы в команды, понятные для ГП компьютера.

Большую часть этого кода можно оптимизировать с помощью инструкции SEE (в данном случае SSSE3), но это было сделано лишь с некоторыми вершинными форматами. Fiora решила, что это никуда не годиться, и оптимизировала координаты точек, текстур и нормалей. В результате это дает прибавку производительности в играх, ранее упиравшихся в вершинный загрузчик Dolphin.
 

Единственная загвоздка состоит в том, что процессор должен поддерживать инструкции SSSE3, а иначе новые изменения задействованы не будут. Процессоры Intel поддерживают этот набор начиная с линейки Core2Due (если быть точнее, то с Pentium 4 Prescott), а AMD – с линейки Bobcat.

JIT: оптимизация операций с одинарной точностью на основе их данных

Еще в августе Fiora исправила округление при умножении с плавающей запятой. Это изменение требовалось для точной эмуляции физики во многих популярных играх, таких как F-Zero GX, Mario Kart Wii и прочих. Этого удалось добиться за счет небольшого снижения производительности, так как округление нужно было эмулировать для всех операций умножения.

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

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

Новая информация о прогрессе пользовательского интерфейса на базе QT

Dolphin использует wxWidgets с момента своего перехода к открытому коду. Несмотря на то, что для своего времени он был отличным, и претерпел множество изменений, его ограничения и недостатки постоянно причиняли неудобства разработчикам и пользователям. Одно из решений заключалось в использовании интерфейса Qt. Работы над ним начались еще в сентябре, но результат ограничился лишь показом слов «Hello World». С тех пор был проделан значительный прогресс, и, начиная с ревизии 4.0-4006, Qt интерфейс даже научился запускать игры. И хотя работы еще далеко не закончены, это огромный шаг вперед в сторону нового революционного дизайна.

Но это еще не все: новый список игр, сделанный разработчиком waddlesplash, поддерживает новые режимы отображения списка игр.
 

Древовидный режим (tree view) отображения в DolphinQt позволяет ограничивать отображение искомых игр папками. То есть, в какой бы папке не находилась бы игра, она будет показываться в древовидном режиме, и игры в целом можно будет сортировать по типу приставки, жанру, франчайзу – чему угодно!
 

Сеточный режим (Grid view) является таковым в буквальном смысле. Картинки всех игр и их названия выкладываются соответствующим образом, благодаря чему они заполняют все доступное пространство.

На данный момент единственный способ протестировать интерфейс Qt – самостоятельно скомпилировать Dolphin с подмодулем Qt. Так как он еще не готов и может мало что делать, он представляет интерес лишь для продвинутых пользователей и разработчиков. Но в будущем он усовершенствуется и станет лучше интерфейса wxWidgets, и упростит разработчикам работу над ним.
0

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

  1. Cyrax_X
    Cyrax_X от 2 декабря 2014 22:39
    Класс!
  2. от 3 декабря 2014 16:34
    Много букв, фризы в резиденте исправили?
Добавить комментарий

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