Oculus Quest/Goで徹底的にALVRの遅延と画質をチューニングする

2019年5月31日

ALVRを使うとOculus QuestでSteamVRのPCアプリを楽しめます。この記事ではALVRのチューニングの考え方と設定例を紹介します。初期設定や基本的な使い方はこちらの記事を参照して下さい。

前提条件

アクセスポイント

最終的には、動かすアプリケーションに合わせてチューニングしていくことになりますが、そのようなチューニングが生きてくるのは、Oculus Quest・Oculus GoがSteamVRを動かしているPCと高速な通信が行えることが前提になります。

PCとの通信は無線で行いますから、高速な通信を行うためには無線通信に使うアクセスポイントが特に重要です。Oculus Quest/Oculus Goが対応している無線規格は一番新しいものは802.11acです。つまり性能を引き出すためには802.11ac対応のアクセスポイントが必須要件になります。

一口に802.11ac対応のアクセスポイントと言っても同時使用出来るアンテナの数に合わせて、最大通信速度が433Mbps,866Mbps,1300Mbpsのものがあります。

Oculus Quest・Oculus Goは866Mbpsの2×2に対応していますので、なるべく866Mbps以上に対応するものを選ぶようにして下さい。

また、アクセスポイントのLAN端子が1000BaseT(ギガビットイーサネット)に対応している事も重要です。100BaseTXだと、アクセスポイントとPCの間の通信がボトルネックになり、せっかくの802.11acの速度が生かせません。

オススメの製品

筆者が実際に使っていて十分な性能が引き出せているのは以下の製品です。MU-MIMOと呼ばれる端末が多数つながったときにも性能が低下しない機能を持っているため、ALVRと他機器の併用時にも安定した速度を得ることができています。

TP-LINKはあまり聞き慣れないかもしれませんが、世界トップシェアのメーカーで、動作も国産メーカーよりも安定しているのでは無いかと思います。

もし他の製品を選ぶ場合は、同等の性能のもの選ぶと安心です。アクセスポイントの性能は無線規格や有線ポートの速度以外にも、パケットの解析・転送処理を行うための計算能力も重要になってきます。Archer A10はwikideviによるとCPUがMediaTek MT7615N(MIPS 880MHz Dual Core/Quad Thread)ですから、このあたりの性能を基準にしてみて下さい。

また、アンテナの数は3本以上あるものが良いでしょう。866Mbpsの2×2ではアンテナを同時に2つ使いますが、アンテナダイバーシティ(通信に有利なアンテナを状況に応じて選ぶ)機能を働かせるには、余分なアンテナが生きてきます。

モバイルホットスポットは?

PCに直接無線インタフェースを追加し、PC自体をアクセスポイントとして振る舞わせる方法もあります。

この接続方法を選ぶメリットは、無線インタフェースがPCに直接つながっているため、通常であればPCと無線アクセスポイント間で生じる遅延を省けることです。しかしながら、PCとアクセスポイント間は1ms以下で通信できますから、これをメリットと取るかは微妙なところです。

デメリットは、筐体サイズに限りがあるためアンテナが貧弱であることと、PCのノイズの影響を受けやすいことです。

持ち運ぶノートPCであれば、アクセスポイントが不要であることは大きなメリットですが、そうで無いのであれば、無難にアクセスポイントを用意する方が良いと思います。

DFSに注意

大抵のアクセスポイントでは、設定で無線のチャンネルを変更することが出来ますが、特に理由が無ければデフォルトの設定にしておくことをオススメします。

もし変更した、もしくは変更したかどうか覚えていない場合は、チャンネルをW52に設定しておくようにして下さい。(W52は5GHz帯のチャンネルです。)

それ以外のチャンネルでは、時々DFSが働き、一定時間通信できなくなることがあります。DFSが発動するかどうかは、住んでいる地域と周辺環境に強く依存します。

参考:DFS(Dynamic Frequency Selection)とは、気象レーダーや航空レーダーなどが優先されるチャンネル(W53とW56の一部)において義務づけられている、自動でチャンネルを変更するための仕組みです。

これらのチャンネルで気象レーダーや航空レーダーが検知された場合、いかなる通信中であっても直ちに通信をやめて他のチャンネルに移動しなければいけません。このとき一時的に通信が出来なくなります。

Webブラウジング等であれば、DFSが発動したことに気づく事はほとんど無いのですが、ALVRでは常にリアルタイムの通信を行っているため、通信が途絶えると致命的な影響があります。

グラフィックスカード

SteamVRのソフトを動かしますから、PCにはそのソフトを動かせるだけの高いグラフィックス処理能力が必要です。

さらに、ALVRはSteamVR作り出した映像を一旦H.264/H.265にエンコードして転送しますから、グラフィックスカードに搭載される動画エンコーダにも高い性能が求められます。ALVRはNVIDIAのNVEncとAMDのVCEの二種類のエンコーダに対応していますが、AMDのVCEはまだ実験的に対応されている段階であり、NVIDIAのNVEncが使える環境を用意するのが無難です。

GPUの世代

NVEncもグラフィックスカードの世代に応じて機能や性能が向上しています。大きな転換点になるのは、Maxwell第2世代のタイミングで、これ以降のグラフィックスカードを使うのが望ましいです。Pacal世代であればさらにエンコード出来る形式が増えています。

出典:Video Encode and Decode GPU Support Matrix

世代を製品名で言い換えると、GeForce 960GTX等でもギリギリOK、ALVRの真価を引き出すにはGeForce GTX 1060等を使うのが良い、ということになります。

またNVEncの性能はGPUのクロックにある程度連動します。描画処理性能のように上位モデルとの性能に大きな差があるわけでは無いのですが、上位モデルの方がより速くエンコードできることも覚えておいて下さい。

通信環境の確認

設定のチューニングに入る前に、まずは通信環境が良好であることを確認します。

ALVRの設定

前述の802.111ac環境であれば、問題なく200Mbpsの速度かつ1%以下のパケットロス率で通信できるはずです。

その確認のために、まずはVideoの設定項目において以下のように「Codec:H.265 HVC, Bitrace:200Mbps」に設定を変更し、ある程度動きのあるSteamVRのソフトを動かしてみて下さい。

アクセスポイントの設定

(追記)Oculus Questのシステムv13で不具合が修正され、この設定は必要なくなりました。

本来であれば改めて設定することはないはずなのですが、Oculus Questにはチャンネル幅が80MHzの時に通信が滞る問題があるため、アクセスポイント側でチャンネル幅を40Mhzに固定しておく方が無難です。

先ほど紹介したTP-LINK製のアクセスポイントの場合、上部の「詳細設定」を選択してから左メニューの「ワイヤレス」→「ワイヤレス設定」を選んだ後に、右上の「5GHz」を選ぶと設定を変更することが出来ます。

他のアクセスポイントにも、大抵は奥深くに設定する項目があるはずなので探してみて下さい。

結果の確認と値の読み方

30秒ぐらい通信させたら左端タブのServerで通信結果を確認します。

結果の意味

各項目の意味は次のようになっています。

項目名 意味
TotalPackets
  • サーバーからOculus Quest/Oculus Goに送信した総パケット(データの塊)の数。
PacketRate
  • 1秒当たりに転送しているパケットの数。
PacketsLostTotal
  • TotalPacketsのうちロスト(無線エラーなどの要因で実際に届かなかった)した数。
PacketsLostInSeconds
  • 1秒当たりのロストパケット数
TotalSent
  • 転送した総バイト数。
SentRate
  • 1秒当たりの転送バイト数。
  • 正常な場合は、設定した動画のビットレートに加えて後述するFecPercentageの分が上乗せされる。
TotalRatency
  • SteamVRで絵を生成してから実際にOculus Quest/Oculus Goで表示されるまでにかかった時間。
EncodeLatency
  • TotalLatencyのうち、1フレームのエンコードにかかった時間。
  • SteamVRで表示されている絵が複雑であればあるほど時間が延びる。
  • 13.8ms(Oculus Quest), 16.6ms(Oculus Go)より時間がかかると、描画がカク付くようになる
EncodeLatencyMax
  • これまでのエンコード処理の中で最大のEncodeLatency。
TransportLatency
  • PCで生成された動画データがOculus Quest/Oculus Goに届くまで通信にかかった時間。
  • 通信速度が速ければ速いほど、動画のビットレートが低ければ低いほど小さくなる。
DecodeLatency
  • Oculus Quest/Oculus Go側で動画データを受け取ってから、1フレーム分をデコードして絵になるまでの時間。
  • EncodeLatencyと同じように、値が大きいと描画がカク付くようになる
FecPercentage
  • 通信データ中に含まれるFEC(Forward Error Correction)データの割合。
  • この割合が高ければ高いほど、パケットが失われても(PacketsLostInSecondsが高くても)前後のパケットから失われたパケットを復旧できる。
  • 余計にデータを送る分通信帯域を消費するため、値が増えるとTransportLatencyも微増する。
FecFailureTotal
  • FECによるパケットの復旧に失敗した回数。
  • 連続してパケットがロストすると失敗しやすい。
  • 1秒間の間に連続して失敗すると、FecPercentageが5%増える。
CurrentFPS
  • Oculus Quest/Oculus Go側で表示しているフレームレート。
  • この値がServerFPSより低い場合は、設定に何らかの問題がある。
ServerFPS
  • SteamVR側で描画しているフレームレート。
  • この値が72(Oculus Quest)or 60(Oculus Go)より低い場合は純粋にPCの性能が足りていない。

Forward Error Correction, FEC:送信データに冗長性を持たせることで、欠落したデータを前後のデータから回復させることが出来る仕組み。動画のストリーミングでは前のフレームからの差分データを送り続けているため、途中でデータが欠落すると、欠落した後の映像を作ることが出来なくなってしまう。そのような状況になるのを防ぐために、ALVRでは普段から回復用に余計にデータを送るようになっている。

注目すべき点

純粋な通信性能を調べる上で、まず注目すべきなのはSentRatePacketsLostInSecondです。

SentRateが205Mbpsを下回っているようだと、純粋にPCの性能や通信の帯域が足りていません。またPacketsLostInSecondが常に増え続けているような状況だと、通信が安定していないと言えます。

そのような場合はPCとアクセスポイントの接続、およびアクセスポイントの設定を確認して下さい。

PacketsLostTotalの数と帯域について

接続直後は大量の通信を行うため、PacketsLostTotalの値が一時的に増えることがありますがそれは問題ありません。

ただ、あまりにもパケットがロストしてしまうとFECの回復に失敗し、それが原因でALVRがFecPercentageを自動で上げてしまう事があります。FecPercentageの初期値は5%ですが10%を超えるようなら、やはり通信の品質に問題がある状態と言えます。

ビットレートが100Mbpsの設定で安定した通信ができて居るのであれば、ある程度は良い体験は得ることは出来ると思います。

ただし、以下のことに注意して下さい。

  • パケットロストが大量に発生してFECの回復に失敗した場合は、FecPercentageが増加し必要な通信帯域も増える
  • FECの回復に失敗した時には、復帰のためIフレーム(前のフレームの差分では無く全体の画像そのもの)の送信が発生するため、設定したビットレート以上の帯域を瞬間的に消費する

つまりVideoで設定するビットレートは、限界ギリギリで設定するのでは無く50%ぐらいの余裕を持たせるべきです。FecPercentageが10%以下で維持できる限界のビットレートが100Mbpsぐらいだとすると、60~70Mbpsぐらいで利用するのが良いでしょう。

また通信速度は速ければ速いほどよいです。通信速度が速いと1フレームのデータを受け取るために必要な時間(=TransportLatency)が短くなります。理論上200Mbpsの時のTransportLatencyは100MbpsのTransportLatencyの半分です。また、パケットロスが発生したときにも、FECによる回復にかかる時間も短くなります。(ただし、前述の通りOculusシリーズやGearVRの最大通信速度は866Mbpsです。)

チューニングにおける考え方

ALVRを徹底的にチューニングしていくと、最後は画質と遅延のどちらを取るか?になります。言い換えると画質と遅延はトレードオフの関係にあります。

遅延を追求すればほぼ違和感なくタイミング依存のゲームをプレイできますし、画質を追求すればPCと直接接続するVRプラットフォームと見間違うほどの映像を得ることができます。

オススメ設定

以上を踏まえた2.4.0alpha4時点でのオススメ設定です。

遅延重視設定

描画品質はそこそこですが、全体的に違和感を感じることは少ない設定です。

  • Codec: H265 HEVC
  • Bitrate: 60Mbps
  • Resolution: 75%

DecodeLatencyの値は解像度に比例して大きくなるようで、Resolutionをこれぐらい下げないと、DecodeLatencyが14msを切りません。そのため解像度を泣く泣く下げています。またTransportLatencyを削減するために、解像度に合わせてビットレートも下げています。ビットレートを下げているため、比較的遅めの通信環境でも問題なく使えます。(とはいえ、802.11acは必要です)

Resolutionを50%にするとさらに遅延を抑えることが出来ますが、映像がかなり悪くなるので75%が限界と思います。ですので、遅延をさらに抑えたい場合は、さらにビットレートを抑えてTransportLatencyを下げる事になります。

Oculus Goであれば60fpsなので、Resolutionは100%でもよいかもしれません。

グラフィックスカードの性能によっては、画面がカクつくことがあります。その場合はCodecをH264 AVCにしてみて下さい。

画質重視設定

パラメータ全てを画質に振り切った設定です。

  • Codec: H265 HEVC
  • Bitrate: 150Mbps
  • Resolution: 125%

得られる描画結果はかなり綺麗で圧縮されていることがほとんど分かりません。Oculus Questであれば、表示パネルが有機ELで解像度は片目1600×1440と、Vive Proとほぼ同等ですから、画質もVive Proと同レベルと言えます。

その反面、SteamVRでの描画解像度は高くなりますから、必要となるPCの性能も高くなります。

また、解像度を上げていますから、転送時間・デコード時間ともに長く、明らかな遅延が感じられます。首を左右に振る3DoF方向の移動であれば、Asynchronous TimeWarpが働くためあまり違和感は感じないのですが、前後を含む6DoFの移動となると、ぬるっと移動する形になり、かなり気持ちが悪いです。

このことから、座ってほぼ3DoFで利用するような場合に使える設定なのでは無いかと思います。

Resolutionは100%でもそれなりに綺麗なのですが、SteamVRのメニュー画面などを表示したときに、線にジャギーが認識できるので、描画品質を求めるならResolutionを125%にした方が良いです。150%は、125%と画質差に比べ必要なビットレートやDecodeLatencyの増加が多いのでややバランスが悪いです。

1つ注意点としては、H265 HEVC+Resolution125%の場合は、注意してみると画面中央付近で水平方向にひずみが感じられます。これが気になる場合はCodecをH264 AVCにしてみて下さい。H264 AVCはH265 HEVCに比べて圧縮率は低いですが、複雑な映像で無ければ品質にそれほど差は感じられないと思います。

最後に

この記事では高速な通信が行えていることを確認した上で、用途に合わせてどのように設定を変更するのが良いのかを紹介しました。まだそこまで使い込んでいるわけでは無いので、もっといい設定があったり、説明に間違いがあるかもしれません。その場合はTwitterやコメント欄で情報を頂けると幸いです。

Oculus Quest+ALVRの体験をもう一段階上げるためには、DecodeLatencyを下げる最適化が鍵になりそうです。Oculus Questに搭載されるSnapdragon835自体は、H265 HEVCの4K UHD(3840×2160)/60fpsの動画を余裕で再生する能力があるわけですから、本来はもう少し良好な結果が得られても良いはずです。

一方で、そんな高解像度の映像を処理することはOculusのシステムは想定してなさそうですから、その辺りのシステムの最適化が進むのを期待するしか無いのかもしれません。

また何か改善が見られたら記事をアップデートしたいと思います。

スポンサーリンク