На GitHub выложили droidnative — это nxnative (тот самый проект Switch-игр нативно на iPhone, iPad и Mac) с андроидным портом. Автор называет вещи прямо: не эмулятор. Игра на Switch и игра на телефоне — один и тот же ARM64-код, поэтому его гоняют на CPU как есть. В репозитории 1 300 коммитов, так что это не набросок на вечер.
Механика простая до неприличия. Код игры переписывают только там, где нужен хост: системные вызовы, регистры потоков. Дальше хост отвечает на syscall'ы Switch и сервисы SDK. Графику NVN переводят в Vulkan и отдают GPU. Эмуляции CPU в цепочке нет ни на одном шаге.
Сборка — только из собственного дампа. На вход идут NSP или XCI, для Switch 2 — .nup либо папка с дампом. На Mac приложение DroidPlay делает всё одной кнопкой. В командной строке флаг --game-apk собирает отдельный APK, без флага игра уезжает в лаунчер на подключённом по adb устройстве. На Windows и Linux запускают python scripts/nxnative_android.py.
Цифры авторские, с реальных прогонов. Pokémon Brilliant Diamond 1.3.0 — 60 fps в Eterna City на Ayn Odin 2 и OnePlus Pad 3. Animal Crossing: New Horizons 3.0.3 — 30 fps на всех трёх тестовых устройствах, включая Retroid Pocket 5. Super Mario Odyssey на Retroid Pocket 5 — 38 fps на вступительной катсцене. Breath of the Wild на Odin 2 — около 20 fps на Великом плато. Зато Mario Kart World на карте мира — около 55 fps.
Совпадением это не выглядит. Карманные Android-консоли вроде Odin 2 и Retroid перестали быть нишевой игрушкой, а nxnative остался Apple-only по выбору мейнтейнера — Android-ветку пришлось выносить в отдельный дом. Плюс Switch 2 уже в руках, и .nup в списке поддерживаемых форматов появился не просто так. Наша оценка: порт вырос из желания поиграть на своём железе, а не из бизнес-плана.
Что это меняет. Главный тезис проекта бьёт по привычке считать «запустить Switch-игру» синонимом «поднять эмулятор CPU». Здесь CPU-эмуляции нет, и именно поэтому 60 fps выглядят реальными, а не рекламными. Для рынка карманных консолей это аргумент: железо уже умеет, дело в трансляции NVN в Vulkan. Для владельца телефона — ничего не меняется: дамп, ключи и сборка остаются на нём.
Кто выигрывает. Владельцы arm64-устройств с Vulkan и своей библиотекой картриджей — очевидно. Автор порта получает внимание к проекту. Кто проигрывает, мы считаем, — Nintendo: юридически проект держится на «bring your own game», но готовые APK с игрой внутри всё равно поползут по форумам. Это не прогноз про суд, а наблюдение за тем, как устроены подобные проекты.
Всё, что мы имеем, — README и таблица прогонов от самого автора. Третьих независимых замеров нет. Поддержка Switch 2 заявлена формально: в таблице есть Mario Kart World, но отдельного разбора, что именно тянет Switch 2-игры и с какими огрехами, в источнике нет. Список рабочих игр короткий, про сбои сказано одной строкой — «падает на Adreno 650 из-за шейдерного компилятора драйвера». Проверять стоит самому: собрать на своём девайсе и посмотреть, а не верить таблице.
.nup. Верить формату в README или ждать публичных прогонов на реальной консольной библиотеке?Прогноз: в течение квартала список рабочих игр в README вырастет, а вот стабильного запуска на Adreno 650 не будет, пока драйверный компилятор шейдеров не объедут обходным путём.
Дисклеймер: официально не подтверждено; проект неофициальный, с Nintendo и издателями игр не связан, всё держится на собственных дампах.
Источник: GitHub — enjoyerofslop/droidnative
Источник: github.com · пост в Telegram