Version: 2018.4
言語: 日本語
VR Audio Spatializers
オープンソースリポジトリ

VR フレームタイミング

VR モードのフレームタイミングは、VSync が有効な非 VR モードとまったく同じように動作します (イベント関数の実行順序 を参照)。唯一の違いは、Unity は基本となる 3D SDK の VSync に依存せず、その代わりに現在レンダリングに使っている VR SDK に依存するということです。ディスプレイのリフレッシュ (更新速度) よりも高速でレンダリングする利点は何もありません。代わりに、Unity は時間を最も効率的に利用することに重点を置いています。

マルチスレッドレンダリングでは、Unity はシミュレーションスレッドと CPU のレンダリングスレッドを同期します。これにより待ち時間が短縮されます。シミュレーションスレッドは主に、シミュレーションに必要なスクリプト、サウンド、AI、その他のタスクを実行します。レンダリングスレッドは、ドローコールをグラフィックスドライバー に送信することに集中します。グラフィックスドライバーは、ドローコールを検証し GPU に送信します。スレッド間で最大の並列処理を実現するために、Unity はグラフィックスコマンドを受け取るとそれらを実行し、同時に次のフレームをシミュレーションします。

Unity は、GPU が最後のフレームを完全にレンダリングして表示するのを待機してから、次のフレームのレンダリングコマンドを送信します。

最少の可能待ち時間

Unity がビュー変換行列に依存する最初のレンダリングコマンドを送信する前に、まず VR SDK からビュー行列を取得する必要があります。待ち時間を可能な限り少なく抑えるために、VR SDK は頭のトランスフォームをフレームごとに 2 回予測します。 

  • 現在のフレームをレンダリングする予測 1 回。この予測は、フレームが画面に表示されたときに、実際に、頭が現実の空間のどこにあるかに対応しています。

  • その次のフレームをシミュレーションする予測 1 回。

Unity は現在のフレームのレンダリング予測をカメラ、コントローラー、シーンレンダリングの情報を必要とするものに適用します。その次のフレームをレンダリングできない場合、Unity は次のフレームのシミュレーションによる予測を使用します。

ハードウェアによるレンダリング処理の詳細は、ヘッドマウントディスプレイの製造元のドキュメントを参照してください。

Unity がフレームを落とすとどうなるか

Unity が完全にレンダリングされたフレームをディスプレイの次の情報更新準備の時間内に提出できない場合、アクティブな VR SDK の種類によって、以下のようなことが起こるかもしれません。

  • VR SDK が以前に送信されたフレームを表示します。これは、ブレのように、著しく体験の質を低下させます。

  • 現在の頭のポーズに基づいて、以前に送信されたフレームを回転して再投影します。これは、静的コンテンツのフォールバックとしてうまく機能する粗い近似ですが、アニメーションや位置の移動があるコンテンツは正しく表示されません。

  • 何らかの形の位置再投影を適用します。これは、欠落している詳細を埋めるために一時的な場合があります。

再投影 (タイムワーピングとも呼ばれます) に関する詳細は、Timewarp (英語) を参照してください。

これはすべて自動的に発生します。この時点で、Unity がすでにレンダリングしているはずの次のフレームを正常に終了するのは、通常は遅すぎます。代わりに、VR SDK は受信した最後のフレームを、最新の予測されたポーズに再投影し、Unity はフルフレームをレンダリングし、再び軌道に戻す次の機会が来るのを待機します。アプリケーションが継続的にフレームを落とす場合は、Unity はフレームを 1 つおきにレンダリングします。

ハードウェアによるレンダリング処理の詳細は、ヘッドマウントディスプレイの製造元のドキュメントを参照してください。

VR の GPU バインドと CPU バインド

各ディスプレイには Unity が関連した特定のリフレッシュレートがあります。ランタイムに VRDevice.refreshRate を使ってこれを取得できます。1 を refreshRate で割ると、1 つのフレームに割り当てられる時間を求められます。

例えば、リフレッシュレートが 90hz の場合、11.1 ミリ秒になります。

  • アプリケーションが GPU バインドされている場合、Unity プロファイラーは 1 フレームの時間を超えた XR.WaitForGPU をミリ秒単位で表示します。

  • アプリケーションが CPU にバインドされている場合、フレームは指定されたフレーム時間より長くかかりますが、Unity プロファイラーは XR.WaitForGPU を 1 フレームより短く表示します。

VR Audio Spatializers
オープンソースリポジトリ