Третья, заключительная часть серии, посвященной пробросу видеокарт в виртуальную машину и организации облачной игровой системы для удаленного подключения по локальной сети с различных устройств.
Если вы читали мою предыдущую статью на эту тему, то знаете, что у меня уже налажена весьма деликатная конфигурация для «облачного» гейминга. Состоит она из одного мощного настольного ПК, одной виртуальной машины с проброшенной GPU и клиентских машин, которые можно использовать для стриминга игр. Из соображений простоты (и низкой скорости интернета) я делал стриминг только по локальной сети.
И все же в этой конфигурации есть слабые места:
- Медленный энкодер видеокарты AMD. Достойную производительность мне удалось получить только при разрешении потокового видео 720p.
- VM Windows 10 иногда не могла запустить энкодер хоста, и драйверы видеокарты выдавали ошибки. Это исправлялось парой перезагрузок VM, и, как мне кажется, было связано с известной проблемой перезапуска (reset bug), которой в мире VFIO славятся карточки AMD – разбираться конкретнее мне не захотелось.
- Иногда потоковая передача либо обрывалась, либо тормозила. Это может быть вызвано картой AMD или самим Parsec.
Я много читал по этой теме и выяснил, что в большинстве случаев для получения оптимального игрового опыта рекомендуют использовать связку Nvidia GPU и Moonlight. Так что, было решено найти подходящую карту.
Видеокарта
На дворе 2021. Мир сходит с ума, и цены на видеокарты просто нереальные. В связи с этим я поумерил свой аппетит и склонился к простому варианту: GTX 1060 6G от MSI. Эта карта скромна, относительно современна для интересующих меня игр и обошлась примерно в ту же цену, сколько стоила новая 5 лет назад, то есть 260 евро. На лучшее в это коварное время рассчитывать не приходится.
Но, тем не менее, она работает! Проведенное в первом проекте тестирование показало, что Nvidia отключили в драйверах намеренный выброс ошибки
error code 43
, что и сделало этот вариант возможным. Сама замена видеокарты проблем не вызвала. Нужно было лишь исправить ID PCI-устройств и через virt-manager
изменить закрепленные за VM Windows устройства, все.Parsec: AMD vs NVIDIA
Поскольку конфигурация для стриминга с помощью Parsec уже была настроена, я решил провести небольшой тест, чтобы понять разницу между этими двумя карточками.
Предыдущая – это AMD Radeon RX570 4Gb от Sapphire. Эти две карты находятся в одном классе производительности, что весьма удачно для сравнения.
Вот некоторые результаты из двух кратких сессий тестирования в Dirt Rally. Прошу сделать на них скидку, так как проводились они без соблюдения каких-либо стандартов. Я просто выбрал одинаковые настройки графики и поиграл с запущенным окном статистики Parsec.
H.264
AMD RX 570: 10мс
NVIDIA GTX 1060: 3мс
H.265
AMD RX 570: 8мс
NVIDIA GTX 1060: 3мс
Разница в скорости кодирования просто огромна, особенно с учетом того, что время между двух кадров составляет 16.6мс при потоке 60fps. Часть задержки относится к передаче по сети и декодированию на клиенте, то есть, чем меньше время кодирования, тем лучше.
Parsec показал себя хорошо, но при этом возникли проблемы с выполнением GPU-декодирования на клиентах Linux. К тому же, в нем отсутствует клиент для iOS. И если последнюю проблему можно проигнорировать, то первую определенно нет.
Moonlight: опенсор-сокровище
Moonlight является альтернативой Parsec. В нем реализован протокол Nvidia GameStream и присутствуют клиенты для большинства популярных платформ. Тестирование я проводил на клиентах Linux (Fedora 34), ноутбуке с Windows 10 (ThinkPad X230), iPhone SE 2020 и старом Google Nexus 5. Я даже попытался запустить клиента Moonlight на Raspberry Pi 1 B+, но, по всей видимости, он для него староват, что привело к ошибке при запуске.
GTA V на Google Nexus 5? Куда реальнее, чем можно подумать
Для настройки Moonlight я открыл клиента и попробовал выполнить автоматическое обнаружение по сети – к сожалению, безуспешно. Так что пришлось ввести IP-адрес VM Windows вручную. Сработало. Инициировался процесс сопряжения, который нужно было продолжить с помощью Parsec, так как необходимо ввести код на машине хоста. После из Parsec я вышел и потоковую передачу начал уже через Moonlight.
Хотя не прям сразу. Moonlight может обнаруживать установленные в систему игры, но для получения такого же опыта удаленной работы с десктопом, какой обеспечивает Parsec, нужно проделать небольшой твик.
В самом начале я заметил, что качество изображения на десктопе хуже, чем в случае с Parsec. Однако в ходе игры это с лихвой компенсируется. Moonlight просто работает. При этом есть очень много опций, включая изменение качества изображения путем настройки разрешения, частоты кадров и ограничения скорости сети.
Лично для меня Moonlight подходит больше, поскольку клиент Linux, упакованный как Flatpak, может выполнять аппаратное декодирование через видеокарту. Играется на машине с Linux просто отлично, что нельзя назвать стандартным случаем. Даже старенький контроллер Xbox One при подключении по Bluetooth через Moonlight работает прекрасно.
Вообще, при использовании Moonlight единственная проблема была связана с сетью. Это хорошо заметно в поле
Network jitter
встроенной статистики, которую можно вызвать комбинацией Ctrl + Alt + Shift + S
. После отключения нескольких сетевых служб эта проблема исчезла.Конфигурация: месяц спустя
По итогам месяца использования я внес в конфигурацию некоторые изменения. Виртуальная машина у меня была запущена постоянно, и я в любой момент мог просто переключиться на нее, чтобы поиграть. Однако в связи с твиком, который я применил для повышения игровой производительности, половина ядер процессора оказались недоступны для других задач, например для повторного индексирования проекта в IntelliJ.
В итоге я решил включать VM, только если реально соберусь поиграть, хотя пока оптимального способа делать это еще не нашел. Я даже назначал запуск/остановку VM на клавишу калькулятора, но потом GNOME начала игнорировать эту привязку и все равно открывать калькулятор, так что проработал этот прием недолго.
Более же серьезным изменением стало сохранение всех игр в пуле ZFS, находящемся в другой VM. Для этого я настроил цель ISCSI, взяв за основу это руководство. При этом я использовал пакет
tgt
. Все сработало на удивление хорошо, но цель ISCSI не хочет корректно подключаться в виртуальной машине Windows при первой загрузке, что несколько раздражает.Позже я понял, что слабым местом являются HDD, и просто расширил SSD-хранилище. В противном случае другие процессы NAS могли нарушать игровой процесс в требовательных играх типа GTA V. Проявлялись проблемы в виде длительной загрузки и прорисовки объектов с запозданием – то есть при разъездах по карте буквально отсутствовала половина дорог и зданий.
Решение с ISCSI также дополнительно обеспечивает бэкап всех игр. Если Windows вдруг в очередной раз решит покончить с собой, и у меня не будет готов бэкап VM, то я просто ее переустановлю, не беспокоясь о скачивании и повторной установке всех игр.
Вердикт
В целом этой конфигурацией я очень доволен. Пользуюсь я ей не очень часто, но все равно круто иногда запустить Art of Rally или BeamNG.drive на любом из своих устройств.
В перспективе здесь, конечно, есть над чем задуматься, особенно касательно более высоких системных требований Windows 11 и современных игр. Сейчас же все работает отлично, и пока я ничего менять не собираюсь.
Комментарии (13)
nicman20061
29.10.2021 15:11+1Хорошо работает связка moonlight + playnite (это агрегатор разных лончеров и эмуляторов) чтобы не добавлять игры вручную.
0x1000000
30.10.2021 01:33+3Спасибо за статьи!
Поделюсь своим конфигом стриминга:
1) На одной квартире стоит игровой ноутбук с карточкой NVIDIA.
2) Ноутбук подключен к роутеру, который может поднимать OPEN VPN (есть белый IP)
3) На смартфоне стоит Moonlight и Open VPN клиент.
4) Когда я хочу поиграть, НЕ находясь в квартире с ноутбуком, я подключаю VPN, бужу компьютер через “Wake up on LAN” и запускаю стриминг через Moonlight.
5) На телефоне играть не всегда удобно. т. к. меленький экран, но на другой квартире стоит большой телевизор, к которому я и подключил свой смартфон (Samsung Note 10+) используя USB HubКак всё это выглядит можно посмотреть на картинке:
Farmatique
31.10.2021 02:54Извиняюсь если вопрос глупый, но зачем поднимать впн если есть доступ к машине с играми через белый айпи? Из соображений безопасности, полагаю?
0x1000000
31.10.2021 22:58В основном для удобства. Не надо прокидывать порты (8 для Moonlight и 1 для Wake Up On LAN) и есть доступ к настройкам роутера. Кроме того, тамошний провайдер не блокирует официально заблокированные в РФ сайты, что весьма удобно, поскольку подключившись к домашнему роутеру через VPN, можно из любой точки легко попасть на заблокированные сайты.
MaxDM1993
30.10.2021 15:53Очень похоже на тот путь который я прошёл при первой настройке. Ожидал увидеть в статье путь подбора оптимальных параметров moonlight и (если было) как заставить на линуксе moonlight использовать hardware encoding (не раз сталкивался с тем, что с этим пунктом просто не заводиться). Сейчас конфигурация такова: ibik Aster (запуск нескольких пользователей на одной машине) + hdmi заглушка привязанная к одному из пользователей + moonlight. Пользователь с заглушкой стартует автоматически. Сам компьютер настроен на пробуждение по сети. На роутере поднят vpn и привязка к одному бесплатному сервису доменных имён. По итогу за компьютером могут сидеть физически (за одним из "рабочих мест") так и по сети за пользователя, на котором запущен moonlight.
Farmatique
31.10.2021 02:46+2Спасибо за инфу. Вопрос может глупый, но зачем поднимать это все дело в виртуалке? С вот этими всеми пробросами ГПУ?
zasyadko
10.11.2021 07:12Если говорить про решение для себя, для дома, чтобы было комфортно, то я недавно открыл для себя Steam Link, работает очень даже хорошо, даже в 4k. Настраивается элементарно за пару минут. Джойстики цепляются к Андроид ТВ, а тот в свою очередь получает стрим с компьютера. Да и вообще можно с любой платформы подключаться.
RaymanOne
10.11.2021 15:59Плюсую, можно даже на iPad выводить без проблем, джойстик нативно тоже цепляется.
suns
Хочу делать себе подобное, но пока останавливают две вещи:
Какие вообще есть проблемы при пробросе виртуальных GPU? Для начала надо же на уровне драйвера nvidia научиться обходить проверки версии карты, чтобы эта фича заработала?
Что с античитами, многие из которых пытаются детектить виртуальную машину и в случае чего блокируют? Я видел некоторые базовые способы их обмануть, но есть такое параноидальное ощущение, что это может быть не достаточно
RaymanOne
карта пробрасывается как бы напрямую, виртуалка видит ее как настоящую и все работает как и на реальном железе. Таким образом например некоторые делают hackintosh - процессорные мощности виртуальные, а карточка "настоящая".
suns
Как я понимаю, в таком случае нельзя две VM делать с одной карточкой, так что я и смотрел в сторону Nvidia vGPU