Beat Saber のレイテンシ・ベンチマーク
注 : 公開後に間違っていた部分などをサイレント修正しています。
「弘法筆を選ばず」というが、弘法とほど遠い存在の私は自分の問題を筆に転嫁しがちである。 Quest 3 に乗り換えれば Beat Saber のスコアが伸びると信じて疑わないし、ノーツを切り損ねるたびに「今のはレイテンシ (後述) の影響」とか思っている。
適当な前口上はともかく、「Quest Link 経由の PCVR より、スタンドアロン環境の方がレイテンシが小さくて快適にプレイできるのでは?」という疑問は以前から持っていた。 Quest Link の不安定さに疲れてきたのもあり、スタンドアロン環境を整えたついでに各種環境のレイテンシを測定してみた。
レイテンシについて
Beat Saber に関する文脈で、「レイテンシ」と呼ばれるものは二つある。
映像と音の遅延差。 Beat Saber の設定画面で調整するのはこれ。
HMD やコントローラのセンサー情報を取得してから、そのデータによる画面表示が行われるまでの遅延 (Motion-to-photon latency; 以下 M2P レイテンシ)。
この記事で扱うのは M2P レイテンシの方である。現実の手や頭の姿勢をそのまま持ち込む VR では、この遅延によるずれが深刻な問題になる。
そこで VR のランタイムはアプリに対し、現時点の HMD やコントローラの姿勢情報ではなく、画面表示時点、つまり未来の姿勢情報を外挿して渡している。このため M2P レイテンシの影響は単純な遅れとして体感されないことに注意してほしい。
ただし、レイテンシの削減が Beat Saber のプレイスコアに良い影響を与えるとは限らない。たとえば振りの角度に対しては外挿による誤差が良い方向に働く。
測定環境
HMD : Meta Quest 2.
GPU : RTX 3070 (ファンが一つ欠損).
OS : Windows 11 23H2.
Quest 本体ランタイム : v69.
Quest PC ランタイム : v69.
Quest Link の設定 :
リフレッシュレート : 90 Hz.
レンダリング解像度 : 5408x2752 (v1.29.2 では実際のレンダリング解像度が違うが、 Beat Saber 側でだいたい同じになるように設定).
エンコード解像度 : 3680x1920 (デフォルト。自分用メモ: 普段は 3968x2080 で使用).
Beat Saber で "$100 Bills (Camellia's "215$-Step" Remix) [Expert+]" を再生し、値を目視で適当に平均。
Quest Link 環境のレイテンシは Oculus Debug Tool で、 Standalone 環境のレイテンシは OVR Metrics Tool にて確認した。 OVR Metrics Tool では "STATS" タブの "Prediction Time" をチェックすることで M2P レイテンシを確認できる。
測定結果 (暫定)
Quest Link / ビットレート依存性 (Beat Saber v1.37.5, Oculus Runtime) :
120 Mbps, NumSlices = 5 : 35 ms (VSync offset = 1).
240 Mbps, NumSlices = 5 : 36 ms (VSync offset = 1).
480 Mbps, NumSlices = 5 : 38 ms (VSync offset = 1).
960 Mbps, NumSlices = 5 : 39 ms (VSync offset = 1, フレームドロップ多).
960 Mbps, NumSlices = 3 : 45 ms (VSync offset = 2, オフセット増加の検証用設定).
Quest Link / Beat Saber のバージョン と VR API による違い (480 Mbps) :
v1.37.5, Oculus Runtime : 38 ms.
v1.37.5, Steam Runtime : OpenXR 設定が行方不明。
v1.29.2, -vrmode oculus : 38 ms.
v1.29.2, -vrmode openvr : 40 ms (ODT の値が信用できるかは不明).
Standalone 版 :
v1.37.5 : 28 … 32 ms.
v1.37.5 (Disable Phase Sync) : 51 ms.
v1.28.0 : 38 ms.
その他 HMD 参考値[*] :
Oculus Rift (CV1) : 20.6 ms.
Oculus Rift S : 27.1 ms.
HTC Vive : 30.8 ms.
Valve Index (90 Hz) : 37.5 ms.
[*]: "Measuring motion-to-photon latency for sensorimotor experiments with virtual reality systems" の Fig. 4b / Sudden Movement のプロットより引用。ここによると Rift S の値は Beat Saber での値と大きくは変わらないので、 Oculus 系については直接比較しても問題ないと思う。その他のデバイスについては「考察」の項参照。
考察
仮に PCVR 専用設計の Quest 2 が存在したら、その M2P レイテンシは 25 ms 前後になると予想される。
Standalone v1.28.0 の値が大きいのは、 Extra Latency Mode が有効になっているから (といっても、固定レイテンシではこちらのモードを使う方が普通)。
https://developer.oculus.com/blog/understanding-gameplay-latency-for-oculus-quest-oculus-go-and-gear-vr/Standalone v1.37.5 では Phase Sync が有効になっている。値が揺らいでいるのはおそらくこのため。
https://developers.meta.com/horizon/documentation/unity/enable-phase-sync/Quest Link は VSync offset の値が同一でもレイテンシが変化する。 VSync offset が上がるタイミングでレンテンシもジャンプするが、 1 フレーム分というわけではない。転送部分のレイテンシをフレーム単位に丸める必要はない気がするが、具体的に何が起こっているかはよく分からない。以前からこんな挙動だっけ?
Rift S - CV1, Index - Vive 間のレイテンシ差はどちらも 7 ms くらい。これは、液晶と OLED の応答速度差が反映されていると考えられる。
一見すると Vive, Index の数値が悪いが、これは Oculus でいう Extra Latency Mode 相当の状態で計測されている可能性が高い (+1 フレームで Oculus 系と一致)。 Beat Saber プレイ時のレイテンシは要検証。
まとめ
ぜんぜんまとまっていない上に途中から自分用メモになってしまったが、もう疲れた。一旦このまま投稿しておく。