見出し画像

Virtual Desktopを有線で使う方法

どういうこと?

そのまんまです。
本来無線で使うVirtual Desktop (以下VD) を有線で使います。
このnoteではQuest2,3 + VDのみをターゲットとしますが、Quest2,3 + Air Link, Steam LinkやPico4 + VDでも同じ方法でできると思います。
Pico4では使えない可能性があります。Issue #493にて報告されています。
もしPico4をお持ちの方がこれを見ているのなら、実際に検証して結果をコメントなりTwitterなりで教えて下さると幸いです。

これVDである必要ある?

それはそう。多分VDである必要性はそこまでなく、またこの記事が役に立つVRユーザーの方は全体の1%にも満たないんじゃないかな、と思います…
Virtual Desktopの便利機能 (Index Emulation等) と有線接続の安定性を同時に受けたい欲張りな方や、ネット環境が貧弱で無線VR体験が悪い人にはオススメかもしれません。

追記ログ

2024/05/12 13:25: 大幅加筆修正 (参考にさせていただいたページ等を書くのを完全に忘れていました。ごめんなさい!!)
05/26 23:55: 大幅加筆修正 2
08/19 19:52: 修正


概要

Genymobile開発の「gnirehtet」というソフトウェアを使用してリバーステザリングをQuestに対して行います。
これにより、Quest上の (IPv6を除いた) 通信をPCで中継できるようになり、またVDのみならず、Steam LinkやAir Linkを有線USB接続で実行できるようになります。

ちなみにGenymobileは本社をサンフランシスコに置いたAndroid絡みのおもしろ企業で、
有名なものでいえばPCからAndroidを操作したり画面を見たりできる「scrcpyや、
Android エミュレーター「Genymotionを開発したところです。

「Genymotion」の名を見たことある人は結構多い気がします。

フルトラと併用できる?

できます。 (Quest2 + HaritoraX, Standable v2で検証済み)
Vive TrackerやHaritoraX Wirelessなどでの検証結果をお待ちしております。

無限Linkケーブルと併用できる?

できます。 (Quest2 + 充電器 + CtoCケーブルセットで検証済み)
ただし商品ページにもありますがQuest3だとOS側充電制御により? 途中からバッテリー消費量が充電量を上回ってしまうことがあるようで、無限プレイは厳しそうです。

正しくUSB-PD給電も行われます。快適な無限VR生活!

検証の際、制作者の@en129様より無限Linkケーブルの提供を頂きました。
ありがとうございます!
無限Linkケーブルはen129様のBoothより購入できます。

やり方

少々手間ですががんばりましょう。
おおよそこちらの記事と内容は同一なので詳しい方はそっちを見たほうが楽かもしれません。
gnirehtet公式の説明書 兼 導入ガイドはこちらから

Questを開発者モードにする

adbを使用したUSBデバッグ機能を使ってリバーステザリングを張る都合上、開発者モードが必須です。
このnoteに書きまとめるには長すぎ & 複雑であるため、以下のページを参考に開発者モードを有効化してください (丸投げスタイル

gnirehtetをダウンロードする

GitHubのReleasesページから最新のJavaもしくはRustビルドをダウンロードしてください。
本noteではJavaビルドを使用するため、追加でOpenJDKをインストールする必要があります。

ダウンロードしたzipを適当な場所に展開してください。

Q. Rust版とJava版の違いは何?
A. 作り方が違うだけです。
公式ではRust推奨。
Rust版の方がCPUとメモリの消費量が少なく、またJavaランタイム環境を必要としません。
Rust版で問題が起こった時のためにJava版が残されています。
とりあえずRust版を試してみて、何かおかしいようならJava版を使ってみてください。
ですが、Questに対して使用する場合はRust版だとなぜか特定条件下で非常に不安定になります。
セットアップの手間は少し増えますが、必ずJava版をダウンロードしてください。

詳細は https://github.com/Genymobile/gnirehtet#flavors

JREをインストールする

インストールするJRE (JDK) は多分なんでもいいです。というよりJRE 8があればいいっぽい。 あまりにも古すぎるとダメです。
具体的にはバージョン55.0以上のクラスファイルが読み込めるJava 11以上が必要となります。

本noteではMicrosoft Build of OpenJDKを使用します。
ダウンロードページから最新のWindows向けインストーラーをダウンロードし、指示に従ってインストールしてください。

ぶっちゃけjava.exeに対してPATHが通っていれば多分なんでもいいのでお好きなもので構わないと思います。

インストール完了後は一度PCを再起動してください。PATHが通りません。

もし java に対して古いJavaが通っているようならgnirehtet-run.cmdの先頭にある「java」を新たにインストールしたOpenJDKのjava.exeのパスに書き換えてあげる必要があります。

Program Files以下にインストールした場合は必ずダブルクオーテーション (") で囲ってください。しにます。

adb用ツールをダウンロードする

こちらのページから「SDK Platform-Tools for Windows をダウンロード」をクリックし、利用規約に同意して最新のリリースをダウンロードしてください。

ダウンロードしたzipを展開し、「platform-tools」ディレクトリ内にある以下のファイルをgnirehtet.jarがあるディレクトリに配置してください。

  • adb.exe

  • AdbWinApi.dll

  • AdbWinUsbApi.dll

めんどくさかったら全部ドラッグしても大丈夫です。

起動用ファイルを弄る

「gnirehtet-run.cmd」をメモ帳などで開き、中の「run」を「autorun」に差し替えるだけです。
これは「今繋がっているものも含め、今後接続する全てのデバイスに対して自動的にリバーステザリングを張るオプション」です。
gnirehtetを起動した後にQuestを接続するため、この設定にしないとリバーステザリングが張られません。

gnirehtetを起動する前にQuestを接続する場合はrunのままでもいいと思いますが、autorunはrunの効果も含むため変えておいて損はないです。
VR遊びを終えたらちゃんとCtrl-Cなどで落としましょう。
詳細はGitHub - gnirehtet READMEをどうぞ。

ここまで出来たらほとんど終わりです。
次にVDを使用する際の最低限の設定です。

VDの設定を (少し) 弄る

PC側VDの設定は「Automatically Adjust Bitrate」をオフにしておくぐらいです。
有線接続といってもVDから見たら無線接続と変わらないので、LAN環境が弱い場合最大ビットレートが大幅に制限されてUSB接続のメリットが潰れます。
 要検証。
ついでに「Preferred Codec」を「H.264」か「H.264+」にしておくと遅延が減らせて嬉しいかも。
HEVCでも10ms程度しか変わらないので好みの範囲です。

Quest側VD (以下クライアント) は少し弄る必要があります。
STREAMINGタブ内「Synchronous Spacewarp」「Video buffering」をオフにしてください。
それぞれ「FPS低下時のフレーム補間」「映像のバッファリング」です。
有線接続の場合バッファリングをしてもそこまで変わらないどころか (微量とはいえ) 遅延が増えるのでオフにしても問題ないならオフにしておくとお得。

もし何らかの事情でRust版を使用する場合は追加でSETTINGSタブ内「Microphone Passthrough」を必ずオフにしてください。
バグ?により非常に高頻度でセッションが切られます。

https://twitter.com/SzlyNe_/status/1789388081998495841 , GitHub Issue #483

STREAMINGタブ内「VR Bitrate」を100Mbps以上まで上げてください。
単純にその方が綺麗になるからです
「GPUは強いけどネットワークが弱い」という理由でGraphics QualityやFrame Rateを上げ渋っている方はついでに上げてあげるといいと思います。
ただし上げた分だけフレームレートは低下し、またエンコード/デコード遅延も増加するため、GPU性能自身の許容できる遅延の幅と相談して設定してください。

ただし、Java版では150Mbps以上の通信を流そうとすると不安定になるようです。
余裕を持って100 - 120Mbpsぐらいに設定しておくのがいいんじゃないでしょうか。自身の画質許容幅と相談してください。
ちなみにAir Linkでは200Mbpsが公式でサポートしている最大値です。

VR接続をする

  1. gnirehtet-run.cmdを起動

  2. QuestとPCをUSBで有線接続

  3. (USBデバッグを許可 & VPN接続を許可)

  4. VD接続

ぶっちゃけgnirehtet起動してUSB繋いでVD繋ぐだけなので人によっては1ステップしか増えません。私がそうです

gnirehtetを起動 & 有線接続

さきほど改変したgnirehtet-run.cmdを起動するだけです。
その後Questを被った状態でQuestとPCをUSBケーブルで接続してください。Questを被ってないとUSBデバッグのプロンプトに気付けなかったりするためです。PC画面とかUSBポートは鼻の隙間などから気合で見てください。

初回接続の場合はUSBデバッグの許可とVPN接続の許可が求められます。
必ずどちらも許可してください。
USBデバッグは「このコンピューターからのUSBデバッグは常に許可する」みたいな奴を押しておくと今後が楽。

一回gnirehtetを有効化するとそれ以降Quest OSが「有線経由のネットワーク接続を優先するようになる」ため、Quest単体ではインターネットに接続することができなくなります。
回避方法は (おそらく) 無く、Questを再起動することで解決できます。
OSやアプリのアップデートなどはリバーステザリングを張る前に行うことをおすすめします。

有線接続モードであっても一応WiFiには繋がった表示になります。
勘違いしやすいので注意。これAndroid OSでもそうなんでしょうか?

VPN接続のプロンプトに関しては挙動がいまいち分からず、もしかしたら画面が暗転して出てこないように見える可能性があります。
もしUSBデバッグ許可後画面が暗転したなら以下のRedditの投稿に従ってVPN接続を許可してください。

https://www.reddit.com/r/OculusQuest/comments/nxe88k/virtual_desktop_working_over_usb/
今はもう起こらないかも?不明。

VD接続

gnirehtetが起動していて、正しくリバーステザリングが張られていることを確認した上で通常通りVirtual Desktopを起動してPCと接続してください。

PCと接続した状態で、PC側のインターネットを切断 (LANケーブルを抜く、WiFiをオフにするなど) してもVDセッションが維持されていれば成功です。お疲れ様でした。
以降はgnirehtetを起動 → USB接続 → VD接続の順番で行うことで有線でVirtual Desktopが使えます。

なお、何らかの拍子でUSB接続が切れると当然ネットワーク接続が切れるしVDセッションも切れるので簡単にUSBが抜けたりしないようにしてください。

よくあること

Q. Quest単機でネット繋がらないんだけど

再起動するか、PCと接続した状態でインターネットに接続してください。
Quest OSの仕様なのか一度リバーステザリングを張ると有線でのインターネット接続を優先する挙動になり、PCと接続していない状態ではインターネットに接続できなくなります。

Q. なんかPCと接続できないんだけど (QuestからVDが見えない)

USBを刺し直してgnirehtetを再起動し、再度リバーステザリングを張ってください。必要に応じてVD Streamerを再起動も。
切っ掛けは不明ですが、何らかのタイミングでVD Streamerと正常に通信できなくなることがあるようです。

Q. なんかPCと接続できないんだけど (切断されまくる)

PCとQuestを再起動して再度リバーステザリングを張ってください。
セットアップ後どちらも一回は再起動しないとVDとセッションをうまく張れません。
また、セットアップ後も何らかの切っ掛けでセッションをうまく張れなくなって接続と切断を繰り返すようになる可能性があります。
その場合もPCとQuestを両方再起動してあげれば直るはずです。[要検証]

Rust版でMicrophone Passthroughを使っていませんか?Java版を入れてみてください。
理由は不明ですが、Rust版gnirehtetでMicrophone Passthroughを使うと妙に不安定になります。
このバグ?は既に各所で報告されているようですが、半年近く放置されているので公式での解決は望めなさそうです。

Q. なんか異様に重い

あらかじめQuest側VDのSTREAMING→Show Performance Overlayにチェックを入れておいて、どのLatencyが高いか調べておく必要があります。

Encoding, NetworkingのLatencyが異様に高い場合:
gnirehtetのウィンドウにフォーカスを当ててみてください。
Windowsの持っている? 「フォーカスが当てられているウィンドウに対してCPU時間を多く割り振る」仕様を使ったものです。要検証。
また、adb.exeとjavaw.exeのCPU優先度を「通常以上」か「高」にすると改善されるかもしれません。そのかわりVRゲームやその他ツール類 (XSOverlayとか) が重くなるかもしれないです。

GameのLatencyが高い場合:
ゲームの設定を下げてみてください。
CPU性能が足りていなくて重い場合はどうしようもないです。

DecodingのLatencyが異様に高い場合:
わかりません。(◞‸◟)
左手メニューボタンを2回押してVDに戻ったあともう一回メニューボタン2回押しでVRに戻ってくると直ってることが多いです。
PCとの相性によってはコーデックを変えると改善されるケースもあるようです (ソース: フレンド) 。

Q. たまに落ちるんだけど

USBを刺し直してgnirehtetを再起動し、再度リバーステザリングを張ってください。マジで原因不明。
多分何かのタイミングでgnirehtetのプロセスが固まってしまうことが原因な気はしますが、それにしても再現性がなさすぎる…。

参考資料

完全に書くのを失念していました。該当者様には大変申し訳ないです。


この記事が気に入ったらサポートをしてみませんか?