Хотел перенести сохранения со Switch на Steam Machine, но в итоге создал приложение

Прокомментировать Просмотры: 0

В августе я рассказывал в X о двух неделях со Steam Machine и вскользь заметил, что настроил синхронизацию сохранений между Switch и Deck: «вручную, но работает». Позже мне захотелось вспомнить, как именно я переносил сохранения, и перенести свою конфигурацию с Deck на машину. В итоге появилось приложение с установщиком на GitHub, а также два пулл-реквеста — в EmuDeck и MangoHud.

Сам я не написал ни строчки кода. Я объяснял агенту, что мне нужно, и проверял результат на реальных устройствах, а он разбирался с настройками, создавал приложение и установщик. Мне кажется, сейчас с помощью ИИ в игровой сфере делают немало подобного: от модов до доработки инструментов под свои нужды. Это мой вклад в общую копилку.

Что получилось

Проект получил название Switch Deck Sync. У него две основные функции.

Первая — синхронизация сохранений между Switch и Ryujinx по Wi-Fi. Можно поиграть в Zelda на консоли в дороге, а дома нажать кнопку в библиотеке Steam и продолжить с того же места на Deck или машине. В обратную сторону это тоже работает.

Вторая — использование microSD в качестве картриджа. На карте хранится вся библиотека Switch вместе с профилем и сохранениями. Вставляешь её в Deck и играешь, затем переставляешь в машину и продолжаешь. Синхронизировать данные по сети между двумя устройствами на SteamOS не нужно: они по очереди обращаются к одной и той же библиотеке.

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

Синхронизация со Switch

Изначально всё задумывалось просто: сравнить сохранения и перенести более свежее. Однако ориентироваться на время изменения файлов оказалось ненадёжно. Поэтому приложение сравнивает хеши содержимого с данными предыдущей синхронизации. Если изменилась только одна сторона, сохранение целиком переносится на другую. Если обе — приложение спрашивает, какой прогресс сохранить. Файлы разных прохождений при этом не смешиваются.

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

На Switch необходим FTP-сервер. Сначала мы попробовали FTP из DBI, но в моей конфигурации при чтении сохранений он выдавал ошибку «Read out of file range». Установить её причину нам так и не удалось. Тогда мы взяли открытый ftpsrv, и агент обнаружил в нём конкретную ошибку проверки типа сохранения при открытии на запись. Исправленная сборка, патч и исходники доступны в релизе.

Установить всё можно следующим образом. Понадобятся Switch с поддержкой homebrew и Ryujinx на Linux; EmuDeck и отдельная карта необязательны.

  1. Скачать ZIP из релиза, распаковать его, открыть Install.desktop в Desktop Mode и выбрать синхронизацию со Switch.

  2. Скопировать ftpsrv-save-sync.nro в папку /switch/ на Switch и запустить его.

  3. Ввести в приложении адрес, который показывает ftpsrv, выбрать профили Switch и Ryujinx, а также игры.

  4. Закрыть игры на обоих устройствах и запустить синхронизацию.

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

microSD как картридж

У меня была карта на 512 ГБ с обычными играми для Deck и ещё одна, пустая, на 64 ГБ. Её я решил полностью отвести под Switch.

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

На новом устройстве достаточно трёх шагов: установить EmuDeck и выбрать в нём Ryujinx, установить Switch Deck Sync в режиме переносимой библиотеки и вставить карту. Потребуется карта в формате ext4 и нативный Ryujinx из EmuDeck. Steam Machine стала первым устройством, на котором установщик прежде не работал, и я специально прошёл всю процедуру самостоятельно, без агента и SSH. Все три игры — Mario Odyssey, Breath of the Wild и Mario Kart 8 — запустились со своими сохранениями.

Заодно я перенёс Super Smash Bros. со своего картриджа. В DBI раздел картриджа для MTP по умолчанию отключён (Настройки, Хранилища MTP, пункт «9: Gamecard»), хотя я точно помнил, что раньше он был доступен. К тому же сначала я перепутал картриджи: в Switch стоял Mario Kart.

От чего пришлось отказаться

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

Поначалу приложение привязывалось к конкретной карте по UUID. Это противоречило самой идее: пользователь может купить карту большего объёма или завести несколько библиотек. Теперь приложение ориентируется на выбранный кардридер.

Был и собственный посредник для запуска игр, который вмешивался в работу AutoMap. Мы его убрали: эмулятор запускается средствами EmuDeck, а игры и обложки добавляет Steam ROM Manager.

Кроме того, синхронизация оказалась слишком тесно привязана к карте, хотя многим нужна только она, а игры хранятся во внутренней памяти. Теперь основной вариант установки — синхронизация со Switch, а карта предлагается как дополнительная возможность.

Отдельной задачей стал Game Mode. Приложение запускалось, но я видел чёрный экран. Лишь после нескольких попыток удалось заставить работать интерфейс на SDL2. Сейчас в нём доступны английский и русский языки, а в библиотеке Steam у приложения есть собственная обложка.

Пока это предварительная версия. Я проверил её на трёх своих играх и не обещаю, что она будет работать со всеми остальными.

Затем агенту понадобился доступ к машине

Игры на машине запустились, но обнаружились две проблемы, уже не связанные с кодом приложения. Чтобы разобраться в них, агенту понадобился терминал на устройстве. На Steam Machine для этого нужно выйти в Desktop Mode, открыть Konsole и что-то ввести с геймпада, глядя на телевизор. Включать ради этого SSH и набирать с контроллера команду с ключом для authorized_keys мне не хотелось, поэтому агент подключался через floo. На машине нужно ввести всего одну строку:

curl -sL floo.run/sh | bash

На экране появляется код. Я диктую его агенту, а он запускает у себя:

bash <(curl -sL floo.run/powder) connect КОД

После этого агент получает shell от имени пользователя deck, пока открыта Konsole. Стоит закрыть окно — доступ исчезает, никаких ключей на машине не остаётся. В репозитории floo есть AGENTS.md: агенту достаточно ссылки на него и кода.

Несколько важных деталей. sudo, как обычно, запросит пароль; в SteamOS его сначала нужно задать через passwd, а вводить придётся самостоятельно на машине. Быстрая сессия через публичный relay длится не больше 30 минут; для длительной работы можно поднять свой. И ещё нужно запретить машине засыпать: у меня агент дважды терял связь посреди проверки, потому что устройства уходили в сон.

Гироскоп или раскладка: выбирайте что-то одно

Mario Kart сразу заработал с четырьмя геймпадами. А вот Zelda сообщила о неверном количестве контроллеров. Я открыл настройки ввода Ryujinx, чтобы отключить лишних игроков, и обнаружил странность. После посещения настроек гироскоп работает — целиться наклоном Steam Controller очень удобно, — но раскладка AutoMap сбивается и A превращается в B. Если настройки не открывать, раскладка остаётся правильной, зато прицел не реагирует на наклон.

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

Не обошлось и без неприятного момента. Агент решил, что проще поправить сам эмулятор, и молча принялся пересобирать Ryujinx из исходников. Сборка завершилась ошибкой, я высказал всё, что об этом думаю, и попросил найти конкретные локальные ошибки. Их оказалось три, и все — в AutoMap внутри EmuDeck.

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

Встроенный в EmuDeck GyroDSU здесь не помогает: он считывает датчики самого Deck, а у машины собственных датчиков нет — они находятся в контроллере. Позже я удалил GyroDSU с машины, но оставил на Deck.

После исправления Ryujinx напрямую считывает данные одного контроллера с гироскопом, а на Deck всё, как и прежде, работает через DSU. Есть и компромисс: переназначения Steam Input для этого контроллера в эмуляторе больше не действуют. Меня это устраивает: настройкой контроллеров для эмулированных игр должны заниматься сами эмуляторы, а что-то менять поверх этого понадобится очень редко.

PR находится в EmuDeck с конца октября; ответа пока нет.

Счётчик FPS, который возвращался только после перезагрузки

Вторая проблема поначалу казалась незначительной. После запуска любой игры Switch в оверлее Steam исчезал счётчик FPS, причём затем он не отображался уже ни в одной игре. Помогала только полная перезагрузка машины.

Причиной оказалась ошибка в MangoHud. Он читает /proc//fdinfo запущенного процесса и перед открытием каждого файла проверял его существование. Если доступ к процессу закрывался именно в этот момент, проверка вызывала исключение прежде, чем успевал сработать уже написанный обработчик ошибки открытия. В результате падал весь оверлей. Проверки оказались лишними, и исправление свелось к их удалению.

Автор попросил убрать из PR тест, оставив только исправление, после чего принял изменения. Мой коммит в MangoHud целиком состоит из удалённых строк.

4K120 с HDR работает, но без VRR

Попутно обнаружилась ещё одна история. В Kingdom Come 2 изображение выглядело недостаточно плавным, хотя счётчик показывал 60 FPS. Я переключил вывод с 4K на 1440p при 120 Гц, снял ограничение кадров и включил VRR. На средне-высоких настройках игра выдавала 80, 90, 100 FPS — такой плавности я прежде не видел.

Мой телевизор LG поддерживает 4K120, и компьютер выводит на него изображение именно в этом режиме, а машина предлагала максимум 4K60. Первая причина оказалась банальной: у телевизора два входа HDMI 2.0 и два HDMI 2.1, а машина была подключена к первому, который просто не сообщает о поддержке 4K120. Я переставил тот же кабель в четвёртый вход, и нужный режим появился в списке.

Однако с HDR изображение в этом режиме становится выбеленным — это заметно уже в меню Steam. Без HDR всё выглядит нормально, как и в 4K60 с HDR. В сервисном оверлее телевизор показывает для машины «YCBCR420 8b TM HDR10», а для компьютера на том же входе — «rgb 12b 4L12 HDR10». Замена кабеля ничего не изменила.

Затем агент выяснил, что быстрый режим HDMI 2.1 в драйвере amdgpu на машине отключён и включается параметром ядра. Сам драйвер он не менял. Вместо этого агент выполнил одноразовую загрузку с amdgpu.dcfeaturemask=0x402, после которой машина автоматически перезагружалась в штатном режиме. При такой загрузке телевизор показал те же «rgb 12b 4L12 HDR10», что и для компьютера, а цвета стали нормальными. Но VRR при этом исчез: телевизор показывал FIXED.

Таким образом, железо поддерживает 4K120 с HDR, но совместить этот режим с VRR на штатном драйвере пока не получается. Есть сторонний проект с патчами для amdgpu, который решает проблему, но устанавливать его я не стал. Почему изображение выбеливается в обычном режиме, мы так и не выяснили: в сети встречаются владельцы, у которых телевизор показывает ту же строку, но цвета остаются нормальными.

В итоге я вернул машину в первый вход и оставил 1440p при 120 Гц: там одновременно работают HDR и VRR. С дивана я не замечаю большой разницы по сравнению с 4K.

Ссылки

При этом ничего лишнего в систему не устанавливалось: ни драйверы, ни собственные сборки эмулятора. Когда оба патча попадут в SteamOS и EmuDeck, на новой машине останется установить EmuDeck и Switch Deck Sync, а затем вставить карту.

Если у вас есть Deck или Steam Machine, а рядом лежит Switch, попробуйте и расскажите, что сломалось.

 

Источник

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов