- PVSM.RU - https://www.pvsm.ru -
Не забивайте себе голову тем, что не имеет отношения к настоящему. В будущее надо ещё суметь попасть. Виктор Пелевин — Чапаев и Пустота.
Первая часть [1] посвящена серверной стороне облачного гейминга, вторая часть [2] — клиентской, а третья RDP :)
Эта статья состоит из трёх разделов: предыстория проблемы с RDP, подходы к решению проблемы и неожиданное решение.
С осени 2022 года в МГУ проводится курс Индустриальные исследования в искусственном интеллекте, ИИвИИ [3]. В этом году я, как организатор курса, предложил слушателям выполнить задание [4] по теме LLM-based Multi-Agents Systems, в котором необходимо при помощи LLM управлять персонажем в игровой среде Minecraft на карте МГУ [5]. Поскольку я сторонник тонких клиентов, у меня возникла потребность запустить Minecraft в облаке.
Для запуска Minecraft необходима имплементация OpenGL. Конечно, можно использовать программную имплементацию [6], но она работает медленно. Поэтому лучше, чтобы была видеокарта.
В качестве тонкого клиента я выбрал RDP, поскольку он обладает собственным дисплеем, как можно видеть в сравнительной таблице в конце второй статьи [2]. А поддержка RDP лучше всего реализована в Windows.
Таким образом, получилась связка GPU+Windows+RDP, дальше нужно было выбрать облако.
Важно отметить, что данный пост не является рекламным для облака Selectel, однако я выбрал именно это облако по двум причинам. Во-первых, в этом облаке доступна аренда виртуальной машины с Windows Server 2019 и GTX 1080 всего за 30 руб. в час. Во-вторых, в этом облаке доступна функция заморозки, когда виртуальная машина выключена, но GPU при этом не тарифицируется.
После установки на виртуальной машине с Windows Server 2019 простого советского драйвера для GPU 565.90-desktop-win10-win11-64bit-international-nsd-dch-whql.exe и удалённого подключения через RDP Minecraft запустился.
Но возникла проблема с камерой, точнее с мышкой...
Поиск показал, что данная проблема наиболее известна под названием Erratic mouse movement in 3D games over RDP with RemoteFX [7] (эта ссылка является ключевой и далее я ссылаюсь на неё несколько раз). Оказывается, что в RDP есть два режима передачи положения курсора: absolute mouse movement и relative mouse movement. Про это даже написано в официальной документации от Microsoft [8]. Говорят, что в играх якобы ради быстродействия нужно передавать относительное смещение курсора. Но лично мне кажется, что это сделано, чтобы по RDP не играли в игры...
RDP был выбран по той причине, что он обладает собственным виртуальным дисплеем.
Parsec, Moonlight и Steam подключаются к дисплею видеокарты. Но на не grid драйвере максимальное разрешение в этом случае составляет 1366x768.
А если устанавливать grid драйвер, то нужна будет лицензия. Подробнее о связи драйверов, лицензий и разрешений см. во второй статье [2].
Т.е. для 1080p либо Parsec/Moonlight/Steam и grid драйвер с лицензией от Nvidia
Либо RDP и проблемы с мышью от Microsoft
Совпадение?..
Выяснилось, что при подключении по RDP использовать мышь без relative режима крайне нетривиально. К слову, в Parsec'е есть автоматическое преобразование из relative в absolute. А вот с RDP всё гораздо сложнее...
Основная идея решения по ключевой ссылке заключается в том, что мышь можно передавать через RDP как RemoteFX устройство. Эта процедура подходит для многих usb-устройств и называется RemoteFX USB redirection. В этом случае смещение курсора передаётся в режиме absolute mouse movement.
Попытки включить этот режим следуя руководству по ключевой ссылке не увенчались успехом, поскольку мышка не появилась в списке RemoteFX устройств в панели Локальные ресурсы в RDP. Отдельно отмечу, что руководство по ключевой ссылке апеллирует к официальной документации от Microsoft, где описан способ добавления устройства в список RemoteFX устройств через прописывание GUID в реестре [9].
Также на портале Microsoft в ответ на вопрос How to fix redirected USB mouse with RemoteFX not working over RDP? [10] поинтересовались, является ли мышка беспроводной. Как ни странно, далее действительно будет выявлено различие в использовании мыши по RDP в зависимости от наличия провода.
Подводя итог по базовому подходу, добавлю, что я проверил, что этот подход не работает на одной машине с Windows 10 Home и другой машине с Windows 10 Pro. Оставлю без комментариев вариант, когда для того, чтобы заработало Remote FX USB redirection, рекомендуется обновить версию Windows до Enterprise [11].
Следующим был рассмотрен вариант, когда мышь передается не через RDP, а через стороннее решение. Здесь уместна аналогия с передачей звука в Parsec'е через VB-Audio Virtual Cable. Я проверил следующие три решения для пробрасывания USB:
USB Network Gate [12]
Интересно, что в конце страницы по ссылке сказано, что: You can’t allow RemoteFX to utilize USB devices while connecting to an RDP server if your Windows 10 HOME edition lacks gpedit.msc. Так что возможно в обновлении Windows до Enterprise есть смысл...
USB over Network [13]
VirtualHere [14]
На мой взгляд это наиболее интересное решение. Нужно запустить на локальной машине VirtualHere USB Server [15]. На виртуальной машине в облаке нужно отключить Windows Defender Firewall. Также в облаке нужно запустить VirtualHere USB Client [16]. И затем останется подключиться к локальной машине через Reverse Clients [17].
Все три решения не сработали для моей мыши, она просто не пробросилась. Однако вспомнив про комментарий выше о том, является ли мышка беспроводной, я решил проверить эти решения для Bluetooth мыши, поскольку до этого проверки были для проводной мыши...
На удивление это сработало и с помощью VirtualHere мне удалось пробросить беспроводную мышку при подключении по RDP. Я понял, что пробрасывание сработало, поскольку случайно увидел, что курсор двигается в консоли виртуальной машины в облаке, но не двигается на мониторе локальной машины и на виртуальном дисплее RDP.
Я обратил внимание, что при подключении по RDP создаётся виртуальное устройство мыши, которое работает в виртуальном дисплее RDP. Таким образом, чтобы завершить анализ текущего подхода было необходимо:
- Научиться отключать RDP Desktop Mouse Device
- Научиться отключать консоль виртуальной машины в облаке
Возможно выполнение обоих этих действий привело бы к тому, что после пробрасывания беспроводной мыши, её курсор стал бы двигаться на виртуальном дисплее RDP, но я решил не проверять эту гипотезу. Однако я проверил гипотезу о подключении по RDP PS/2 мыши, поскольку обе проводная и беспроводная мыши до этого были usb-устройствами. К сожалению, при подключении по RDP PS/2 мыши проблема сохранилась.
Также мною были найдены следующие альтернативные подходы к решению проблемы:
Использовать в качестве тонкого клиента Chrome Remote Desktop
Создать виртуальный дисплей с помощью другого тонкого клиента, например [18], remote.it и затем подключиться к нему с помощью Parsec'а
Использовать геймпад либо стрелки на клавиатуре для управления камерой
Вариант со звёздочкой: для создания дисплея также можно использовать физическую заглушку, например, знакомый многим переходник HDMI-VGA, однако по какой-то причине облачные провайдеры не предоставляют такую услугу...
Я уже был готов начать рассматривать альтернативные подходы, когда неожиданно нашёл решение!
Как сказал классик: реальность полна разочарований. Решение было обнаружено там, где я не надеялся его найти: на портале Microsoft'а...
Один архитектор в ковидные времена также столкнулся с той же проблемой [19] и очень просил инженеров Microsoft её решить.
И в комментариях ему посоветовали обратить внимание на следующую ссылку: https://github.com/TKMAX777/RemoteRelativeInput [20]
И у того же автора было ещё одно решение: https://github.com/TKMAX777/RDPRelativeInput [21]
В некотором смысле автор решения реализовал плагин для RDP, который позволяет при подключении использовать мышь без relative режима, что и было нужно для Minecraft'а!
Таким образом, проблема с доступностью курсора в игре при подключении по RDP из второй статьи [2] решена. И теперь RDP также подходит для облачного гейминга. Осталось только разобраться с Horizon'ом...
Автор: brocmc
Источник [22]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/grid/401118
Ссылки в тексте:
[1] Первая часть: https://habr.com/ru/post/538010/
[2] вторая часть: https://habr.com/ru/articles/545612/
[3] ИИвИИ: https://cmc.msut.me/aiinir/
[4] задание: https://t.me/aiinir/122
[5] карте МГУ: https://t.me/aiinir/122?comment=100
[6] программную имплементацию: https://github.com/lightningterror/Mesa3D-Windows/releases
[7] Erratic mouse movement in 3D games over RDP with RemoteFX: https://superuser.com/questions/849918/erratic-mouse-movement-in-3d-games-over-rdp-with-remotefx
[8] официальной документации от Microsoft: https://learn.microsoft.com/en-us/windows/uwp/gaming/relative-mouse-movement
[9] прописывание GUID в реестре: https://learn.microsoft.com/en-us/troubleshoot/windows-client/remote/usb-devices-unavailable-remotefx-usb-redirection
[10] How to fix redirected USB mouse with RemoteFX not working over RDP?: https://learn.microsoft.com/en-us/answers/questions/1239955/how-to-fix-redirected-usb-mouse-with-remotefx-not
[11] обновить версию Windows до Enterprise: https://github.com/stascorp/rdpwrap/issues/2135
[12] USB Network Gate: https://www.net-usb.com/usb-over-rdp/remotefx-usb-redirection/
[13] USB over Network: https://www.usb-over-network.com/usb-for-remote-desktop-download.html
[14] VirtualHere: https://www.virtualhere.com/
[15] VirtualHere USB Server: https://www.virtualhere.com/windows_server_software
[16] VirtualHere USB Client: https://www.virtualhere.com/usb_client_software
[17] Reverse Clients: https://www.virtualhere.com/node/893
[18] например: https://www.reddit.com/r/cloudygamer/comments/i4ivtb/is_there_a_fix_for_relative_mouse_with_windows/
[19] также столкнулся с той же проблемой: https://learn.microsoft.com/en-us/answers/questions/238563/rdp-relative-mouse-movement-support-urgently-neede
[20] https://github.com/TKMAX777/RemoteRelativeInput: https://github.com/TKMAX777/RemoteRelativeInput?tab=readme-ov-file
[21] https://github.com/TKMAX777/RDPRelativeInput: https://github.com/TKMAX777/RDPRelativeInput
[22] Источник: https://habr.com/ru/articles/852342/?utm_campaign=852342&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.