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

Если вы читали мою предыдущую статью на эту тему, то знаете, что у меня уже налажена весьма деликатная конфигурация для «облачного» гейминга. Состоит она из одного мощного настольного ПК, одной виртуальной машины с проброшенной 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)


  1. suns
    29.10.2021 13:39
    +2

    Хочу делать себе подобное, но пока останавливают две вещи:

    1. Какие вообще есть проблемы при пробросе виртуальных GPU? Для начала надо же на уровне драйвера nvidia научиться обходить проверки версии карты, чтобы эта фича заработала?

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


    1. RaymanOne
      29.10.2021 15:49

      1. карта пробрасывается как бы напрямую, виртуалка видит ее как настоящую и все работает как и на реальном железе. Таким образом например некоторые делают hackintosh - процессорные мощности виртуальные, а карточка "настоящая".


      1. suns
        29.10.2021 22:48

        Как я понимаю, в таком случае нельзя две VM делать с одной карточкой, так что я и смотрел в сторону Nvidia vGPU


  1. nicman20061
    29.10.2021 15:11
    +1

    Хорошо работает связка moonlight + playnite (это агрегатор разных лончеров и эмуляторов) чтобы не добавлять игры вручную.


  1. 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


    Как всё это выглядит можно посмотреть на картинке:


    1. Bright_Translate Автор
      30.10.2021 04:52

      И вам спасибо за внимание;)


    1. Farmatique
      31.10.2021 02:54

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


      1. 0x1000000
        31.10.2021 22:58

        В основном для удобства. Не надо прокидывать порты (8 для Moonlight и 1 для Wake Up On LAN) и есть доступ к настройкам роутера. Кроме того, тамошний провайдер не блокирует официально заблокированные в РФ сайты, что весьма удобно, поскольку подключившись к домашнему роутеру через VPN, можно из любой точки легко попасть на заблокированные сайты.


  1. MaxDM1993
    30.10.2021 15:53

    Очень похоже на тот путь который я прошёл при первой настройке. Ожидал увидеть в статье путь подбора оптимальных параметров moonlight и (если было) как заставить на линуксе moonlight использовать hardware encoding (не раз сталкивался с тем, что с этим пунктом просто не заводиться). Сейчас конфигурация такова: ibik Aster (запуск нескольких пользователей на одной машине) + hdmi заглушка привязанная к одному из пользователей + moonlight. Пользователь с заглушкой стартует автоматически. Сам компьютер настроен на пробуждение по сети. На роутере поднят vpn и привязка к одному бесплатному сервису доменных имён. По итогу за компьютером могут сидеть физически (за одним из "рабочих мест") так и по сети за пользователя, на котором запущен moonlight.


  1. Farmatique
    31.10.2021 02:46
    +2

    Спасибо за инфу. Вопрос может глупый, но зачем поднимать это все дело в виртуалке? С вот этими всеми пробросами ГПУ?


    1. avengerweb
      31.10.2021 19:44

      Хост на линуксе ?


  1. zasyadko
    10.11.2021 07:12

    Если говорить про решение для себя, для дома, чтобы было комфортно, то я недавно открыл для себя Steam Link, работает очень даже хорошо, даже в 4k. Настраивается элементарно за пару минут. Джойстики цепляются к Андроид ТВ, а тот в свою очередь получает стрим с компьютера. Да и вообще можно с любой платформы подключаться.


    1. RaymanOne
      10.11.2021 15:59

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