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 が完全にレンダリングされたフレームをディスプレイの次の情報更新準備の時間内に提出できない場合、アクティブな VR SDK の種類によって、以下のようなことが起こるかもしれません。
VR SDK が以前に送信されたフレームを表示します。これは、ブレのように、著しく体験の質を低下させます。
現在の頭のポーズに基づいて、以前に送信されたフレームを回転して再投影します。これは、静的コンテンツのフォールバックとしてうまく機能する粗い近似ですが、アニメーションや位置の移動があるコンテンツは正しく表示されません。
何らかの形の位置再投影を適用します。これは、欠落している詳細を埋めるために一時的な場合があります。
再投影 (タイムワーピングとも呼ばれます) に関する詳細は、Timewarp (英語) を参照してください。
これはすべて自動的に発生します。この時点で、Unity がすでにレンダリングしているはずの次のフレームを正常に終了するのは、通常は遅すぎます。代わりに、VR SDK は受信した最後のフレームを、最新の予測されたポーズに再投影し、Unity はフルフレームをレンダリングし、再び軌道に戻す次の機会が来るのを待機します。アプリケーションが継続的にフレームを落とす場合は、Unity はフレームを 1 つおきにレンダリングします。
ハードウェアによるレンダリング処理の詳細は、ヘッドマウントディスプレイの製造元のドキュメントを参照してください。
各ディスプレイには Unity が関連した特定のリフレッシュレートがあります。ランタイムに VRDevice.refreshRate を使ってこれを取得できます。1 を refreshRate
で割ると、1 つのフレームに割り当てられる時間を求められます。
例えば、リフレッシュレートが 90hz の場合、11.1 ミリ秒になります。
アプリケーションが GPU バインドされている場合、Unity プロファイラーは 1 フレームの時間を超えた XR.WaitForGPU
をミリ秒単位で表示します。
アプリケーションが CPU にバインドされている場合、フレームは指定されたフレーム時間より長くかかりますが、Unity プロファイラーは XR.WaitForGPU
を 1 フレームより短く表示します。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.