Об эмуляторах PS5 для ПК, на примере Astrobot

В последнее время часто всплывает тема эмуляторов PS5 и рекомпиляторов. Я решил попробовать на собственном опыте.
В чем разница между эмулятором и рекомпилятором?
Эмулятор воспроизводит все программное окружение консоли, полностью имитируя работу ее операционной системы и всех ее API (не обязательно 100%, но как минимум нужных для работы). Эмулятор это всегда отдельная программа, которая сама загружает и запускает на целевом хосте немодицифированную оригинальную игру с консоли. Прослойка короче, точнее целый набор прослоек + UI.
Рекомпилятор берет оригинальный бинарник игры и преобразует его в новый бинарник, совместимый с операционной системой хоста (в нашем случае это Windows) и который можно запускать напрямую, без стороннего софта. И тут есть важный момент: по-сути рекомпилятор "вшивает" все функции эмулятора + саму игру в один исполняемый файл, из-за чего создается иллюзия, будто бы рекомпиляция != эмуляции. Вовсе нет, разница только в том, что эмулятор существует отдельно от игры и нужно сначала запускать его, а потом игру. А при рекомпиляции вы получаете готовый бинарник, в котором есть и код игры, и код для эмуляции системных функции и api консоли.
При рекомпиляции вы теряете возможность накатить потом апдейты на игру (однако не всегда, если апдейт изменяет только ресурсы игры, то это возможно; а вот апдейты, связанные с изменением кода, всегда требуют повторной рекомпиляции).
Однако это не всё. Вторая часть проблемы, это общая память. В PS5 процессор и GPU используют общую быструю память, что сильно упрощает жизнь разработчикам и позволяет делать разные хитрые оптимизационные трюки, которые на обычном ПК невозможны. И вот это уже неизбежно приходится эмулировать. Эмулятор или рекомпилятор - обоим нужно осуществлять точную эмуляцию поведения памяти на консоли. В случае с обычным ПК это в определенных ситуациях может приводить к множеству дополнительных операций чтения/записи/копирования данных CPU <-> GPU, где бутылочным горлышком может стать шина PCI-E (она значительно медленней общей памяти на консолях) или сам процессор хоста. Но здесь сразу следует заметить, что это лишь в общем, а на практике в 99% случаев не нужно постоянно перемещать данные туда-сюда между CPU и GPU, и все ок.
Но, если разрабы конкретной игры применяют где-то какой-то хитрый алгоритм, который особенно интенсивно использует общую память и что-то постоянно перезаписывает в памяти, то эмуляция вот именно этого может быть серьезной проблемой и источником фризов. Даже не смотря на то, что все современные эмуляторы PS5 имеют сложную систему управления памятью, которая призвана не допускать избыточных операций копирования данных.
Ну и основная проблема, это конечно разница в работе с GPU на консолях и на ПК. Консоли используют более низкоуровневые API, позволяющие разработчикам иметь больше контроля на процессом и допускающие значительно более хитрые оптимизации, чем можно было бы реализовать на базе Vulkan или DirectX.
Поэтому перед разработчиками любых эмуляторов стоит (вернее стояла, поскольку задача уже почти на 100% решена) сложная задача - 100% точно эмулировать поведение нескольких разных низкоуровневых API консоли, используя только более высокоуровневое Vulkan. Изначально, когда проекты эмуляторов только появлялись, это выглядело как безумие и почти не решаемая задача. Но как мы видим, оказалось что ее можно решить. В том числе благодаря ИИ.
К счастью, язык шейдеров PSSL достаточно похож на HLSL, поэтому через некоторое время удалось решить задачу рекомпиляции шейдеров, путем преобразования их в промежутчный формат SPIR-V, а потом компиляцию уже под Vulkan. Но при этом сразу же возникает типичная для ПК проблема - скомпилированные шейдеры привязаны к драйверу и его обновление инвалидирует кэш шейдеров. Ну и кроме того, в отличии от консолей, любой эмулятор рекомпилирует шейдеры в рантайме, что неизбежно порождает периодические фризы, особенно при первом запуске.
Ладно, про техническую часть можно говорить много и долго, но я просто дал вводную базу и на этом мы заканчиваем.
Тестировать буду на не самом топовом, но и не нищем ПК: Ryzen 7900X3D, 64Gb DDR5 6400 CL32, RTX 4070Ti, Windows 11.
KytyPS5, это классический эмулятор.
В данный момент для нормального запуска Астробота лучше всего использовать специальную ветку эмулятора KytyPS5 - KytyPS5 U59 от Jetsku. Обычный KytyPS5 все еще крашится при запуске игры, хотя последний раз я проверял 6 дней назад и прямо сейчас может быть уже и работает.
Скачиваете архив с эмулятором, берете где-то игру, запускаете эмулятор и в настройках указываете папку с PS5 играми.
Важно: игры должны быть или в .zar-архивах, или распакованные, иначе эмулятор их не увидит.
Перед запуском игры стоит подключить геймпад и желательно с гироскопом. У меня нет оригинальных Dualsense, поэтому я взял давно валявшийся какой-то китайский EasySMX X10, но у которого внезапно есть этот самый гироскоп.
А дальше никакой магии. Игра запускается и работает. Вот так просто, да. С гироскопом тоже проблем нет, ну если не считать того, что он походу в этом геймпаде не откалиброван и поэтому уровень горизонта нестабильный.
Как я уже писал выше, эмуляторы вынуждены делать рекомпиляцию шейдеров в рантайме, поэтому мы сразу сталкиваемся с нашими любимыми фризами из-за компиляции этих шейдеров. Однако при повторных запусках, это уже почти не наблюдается.
В 2К разрешении на моем железе Астробот выдает от 30 до 60 FPS, но в среднем во время игры это 38-45 FPS. Работает стабильно, без крашей или каких-либо визуальных артефактов.
Работа гироскопа:
Отдельно хочу отметить, что игра почти никогда не нагружает GPU по полной. С чем это связано, мне было лень разбираться.
Астробот работает стабильно, за несколько часов игры не было ни одного краша.
В отличии от KytyPS5, AnyPS5 является рекомпилятором, ну или точнее релинкером. Потому что на самом деле код не перекомпилируется, просто заменяются вызовы системных библиотек PS5 на их аналоги + изменяется формат бинарника с ELF на PE, что бы винда могла его запустить.
AnyPS5 абсолютно не дружественный к пользователю. Проект - типичный опенсорс от энтузиастов: вот вам репозиторий, вот вам код, вот вам билд, сношайтесь со всем этим сами. Мануал вон там...
У них есть так называемый web-конвертер, но для астробота он не подошел из-за лимита на размер файлов.
Я не буду утомлять вас подробной инструкцией, потому что точная последовательность действий сильно зависит от того, в каком виде у вас игра. Просто кину пару скриншотов, что бы вы понимали как оно.
Пробный запуск:
Исполняемый файл в итоге хотя и запустился, но дальше черного экрана я не смог продвинутся. Не сегодня.
Потом я нашел обсуждение запуска Astrobot на AnyPS5, там надо собирать отдельную ветку из какого-то форка. Мне стало лень, простите. Кроме того из того же обсуждения видно, что с производительностью у AnyPS5 пока проблемы и нет смысла тратить время на компиляцию из исходников, что бы потом посмотреть на 5-7 FPS в лучшем случае.
Ну как минимум один эмулятор рабочий, позволяет запускать игру и играть в нее, причем без какого-то супер топового железа. Вам не нужно покупать 5090 и 9950X3D.
В целом, прогресс у эмуляторов огромный и останавливаться никто не собирается. Однако как и со всеми эмуляторами, на таком раннем этапе неизбежно есть проблемы и не следует ожидать успешного запуска произвольных игр, пока что.