ステレオ レンダリングとプロファイリング

プロファイリング ツールとステレオ レンダリング プロジェクトを使用する概要。

Windows
MacOS
Linux

多くの点で、ステレオ レンダリング を使用するプロジェクトのプロファイリングは、リアルタイム レンダリング プロジェクトのプロファイリングと同じですが、特に注意が必要な領域がいくつかあります。

同じ点

通常の、ボトルネックを見つけ出し、適切なプロファイリング ツールを選択するというプロセスは同じです。

一般的に、最初の手順は stat unit コンソール コマンドを使用してどのスレッドが最も高い値を示しているかを確認します。

Thread times showing in the Viewport

名前

説明

Frame

Frame 時間とは、ゲームの 1 フレームを生成するのにかかる合計の時間数です。フレームを完了する前に Game スレッドと Draw スレッドの両方が同期されるため、多くの場合、Frame 時間はこれらのいずれかのスレッドで表示される時間に近くなります。

Game

Frame 時間が Game 時間に近い場合、Game スレッドによってゲームのパフォーマンスがボトルネックとなっている (悪影響を受けている) 可能性が高くなります。

Draw

Frame 時間が Draw 時間に近い場合、Rendering スレッドによってゲームのパフォーマンスがボトルネックとなっている可能性が高くなります。

GPU

GPU 時間では、ビデオ カードによるシーンのレンダリングにかかる時間を測定します。GPU 時間はフレームに同期されるため、Frame 時間に近くなる傾向があります。

RHIT

通常、RHI Thread 時間はフレームに同期されるため、Frame 時間に近くなる傾向があります。

DynRes

サポートされる場合 (さらに有効になっている場合) は、DynRes により、Primary Screen Percentage (プライマリ スクリーン比率) と Secondary Screen Percentage (セカンダリ スクリーン比率) が表示されます。

ビルド コンフィギュレーション

プロファイリングでは「テスト」 ビルド コンフィギュレーション のプロファイリングが重要です。これは、プロジェクトの最終シッピング バージョンに最も近いパフォーマンスを示すオプションとなりますが、デバッグ機能とプロファイリング機能にはいくつかの制限があります。

VSync

GPU をプロファイリングしようとすると、VSync に問題が発生しやすくなるため、常に無効にしておく必要があります。Vsync は任意の場所に待機時間を挿入することがあり、最も時間がかかるコードの場所を確認する際に誤った判断を下す可能性があります。

また、目標の Frame 時間にほんの少し届かないことによりフレームレートが半減し、垂直のティアリングがなくなります。これは大きなパフォーマンスの問題であると誤解されることがよくありますが、実際には VSync の制限に対してフレームレートを押し上げる小さな変更で、プロファイリングとターゲットとなるプロジェクト側の最適化により、ほぼ簡単に解決することができます。

異なる点

コンポジタ

ステレオ レンダリングを使用するヘッドマウント ディスプレイ システムには、通常コンポジタが備わっています。コンポジタはアプリケーション (この場合は Unreal Engine) によってレンダリングされる最終フレームを取得し、ヘッドセットの光学レンズとは反対の歪みを適用して画像を正しく表示させます。コンポジタはオプションで、補間されたフレームや他のタスクを挿入することにより、フレームのヒッチや低いフレームレートを滑らかにする追加作業を行うことができます。

それらの作業には時間がかかります。コンポジタでこの作業を行うためにかかる時間が最大 1 ミリ秒かかることは珍しくありません。プロジェクトの Frame 時間を割り当てるとき、このことを考慮する必要があります。つまり、アプリケーションで使用するのは、フレームごとに 1 ミリ秒引いた秒数です。このことから常に平均 Frame 時間は、ヒッチが発生する可能性を考慮し、フレーム数 (コンポジタの場合は 1 を引いて) で割って 1 秒未満にする必要があります。または、動的解像度 を使用して、重いシーンでの Frame 時間の割り当てを満たすまで解像度を下げたり、利用可能な場合は GPU 時間をフルに使用するために解像度を上げたりすることができます。

コンポジタによる強制 VSync

上述の VSync に関連する問題は非ステレオ レンダリングでも同様ですが、ステレオ レンダリングでは、これらの問題は高い解像度とそれぞれの視点を一度レンダリングすることにより悪化します。さらに、多くのコンポジタでは、VSync を常に有効にしています。これは、ヘッドセットの GPU タイミングが正確であることを確認する方法がないことを意味します。Unreal Engine でこれを解決するには、-emulatestereo コマンドライン パラメータで起動して、コンポジタを使用せずにモニター画面へのステレオ レンダリングを実行し、VSync を無効にします。

レイテンシー

厳密にはパフォーマンスの問題ではありませんが、快適な XR エクスペリエンスのためにレイテンシーは非常に重要です。

シンプルなパイプラインが連続して現在のフレームをシミュレートし、それをレンダリングしていきます。

拡大表示するには、画像をクリック。

この単純な方法では、レンダリングはシミュレーションが完了するまで待機するため、すべてを 11 ミリ秒で完了させる必要があることから、厳しい割り当てになります。

代わりに、シミュレーションをレンダリングの少し前に実行させることができます。Unreal Engine 4 では、これを Game スレッド で実行します。次のフレームのシミュレーションの前に、その Game スレッド上で待機が発生します。レンダリングと送信は、別のスレッド (Render スレッド) で発生します。

拡大表示するには、画像をクリック。

ただし、シミュレーションの開始時にポーズを単純にクエリし、レンダリングでそのポーズを使用すると、ヘッドマウント ディスプレイではラグが多いまたは低速と感じられる可能性があります。これは現在、デバイスの位置についてクエリをしてから結果のフレームが表示されるまでの間に 2 フレーム分の時間がかかるためです。

この問題は、レンダリングの前にポーズをもう一度クエリし、その更新されたポーズを使用してレンダリングのトランスフォームを計算することで解決できます。

拡大表示するには、画像をクリック。

この挙動を制御するブール値がいくつかあります。シーンで HMD 表示に使用されるカメラには、[Lock to HMD (HMD にロック)] を有効にする必要があります。これを無効にすると、遅延更新が無効になり、レイテンシーが増加します。モーション コントローラーにも [Late Update (遅延更新)] チェックボックスがあります。アプリケーションで目標のフレームレートに達しているにもかかわらず、期待どおりに反応しないと感じられる場合は、これらの遅延更新設定が有効になっているか確認することをお勧めします。

タイミングに関する追加の考慮事項

VSync に加えて、ステレオ レンダリング ヘッドマウント ディスプレイには他にも、一貫性のあるタイミングがより重要になり、ヒッチの影響を受けやすくなるため、考慮すべきポイントがあります。レンダリングは、ヘッドマウント ディスプレイや、(それほど重要ではありませんが) モーション コントローラーなど他の追跡されるデバイスの動きに関する正確でタイムリーな追跡情報に大きく依存しています。

HMD の追跡位置データのポーリングと、その位置データに基づいたフレームのレンダリングを立て続けに実行する必要があるため、Rendering スレッドが位置データをポーリングしている Game ゲーム スレッドから大きく遅れている場合、Game スレッドは Rendering スレッドが追いつくのを待機します。つまり、シーンが GPU を集中的に使用している場合、CPU も待機する場合があります。これにより、CPU のロジックが低速だと誤解されることがあります (これは、VSync の場合に GPU ロジックが低速だと誤解される状況と同じです)。

さらに、CPU 上の GPU とその逆のタイミングの相互依存性により、また、GPU が最後のレンダリングを行っている間に CPU が次のフレームを作業している場合に、1 つのフレームの速度が低下すると待機のカスケードが発生し、回復までに複数のフレームが必要になる場合があります。その場合、たとえばフレーム 1 で速度の低下が発生した場合に、フレーム 3 の速度が低下する原因を追跡することが難しくなる可能性があります。

タグ
Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
閉じる