メインコンテンツまでスキップ

WebXRアプリケーションの最適化

はじめに

快適なXR体験には、高く安定したフレームレートが不可欠です。VR/ARコンテンツを制作する際には、開発の初期段階でテストと最適化を行い、開発期間を通じて目標フレームレートを維持することがこれまで以上に重要になります。

AR体験では、ワールドトラッキングがパフォーマンスに大きなコストをもたらすことがあるため、フレームレートを慎重に管理する必要があります。これは、ほとんどのユーザーが利用している、一般的にパフォーマンスが制限されたモバイルハードウェアに加えて考慮すべき点です。

VR体験では、シーンを各ビュー(目)ごとに一度レンダリングする必要があるため、レンダリングは特にコストがかかります。PlayCanvasはVRレンダリングが完全に重複しないように高度に最適化されていますが、ステレオレンダリングはモノラルレンダリングよりも依然としてコストが高いです。

パススルー体験では、ARとVRの要件が組み合わされ、基盤となるシステムは、位置特定、画像処理、レンダリングされた画像のオーバーレイのために多くの計算を実行する必要があります。これに加えて、深度センシング、カラーアクセス、画像トラッキングなどの他の使用可能なAPIや、各目に対する重複レンダリングも加わります。

さらに、現代のHMDデバイスは75Hzや90Hz以上の高いフレームレートを要求しており、高効率なレンダリングの必要性をさらに高めています。

しかし、PlayCanvasには、アプリケーションがより少ない時間でより多くのことを実行できるように特別に設計されたいくつかの機能が含まれています。

ドローコールとバッチング

ドローコールとは、エンジンがオブジェクトをレンダリングするために必要な情報をGPUに提供する操作のことです。シーン内のオブジェクトが多いほど、各フレームをレンダリングするために必要なドローコールも多くなります。ドローコールの数を減らすには、カリング、スタティックバッチングインスタンシングによってフレーム内のオブジェクトの数を最小限に抑えることを推奨します。

ランタイムライトマップ生成

各ダイナミックライトには、フレームごとのランタイムコストが発生します。ライトが多いほどコストが高くなり、シーンのレンダリング速度が低下します。ライトをライトマップにベイクすることで、スタティックライトのコストをテクスチャをレンダリングするだけのコストに大幅に削減できます。ライトマップは、お気に入りの3Dモデリングツールを使用してオフラインで生成することも、PlayCanvasの組み込みランタイムライトマッパーを使用することもできます。

リアルタイムシャドウの慎重な使用

ダイナミックライトと同様の理由で、ダイナミックシャドウにもフレームごとのランタイムコストが発生します。特にオムニライトは、シャドウマップを生成するためにシーンを6回レンダリングする必要があります。ダイナミックシャドウを落とすライトが多すぎるのを避けるべきです。

フィルレートとオーバードローに注意する

フィルレートとは、GPUが時間内(通常は1秒あたり)に埋めることができるピクセル数のことです。高価なフラグメントシェーダー(例:多くのライトと複雑なマテリアル)と高解像度(例:高いデバイスピクセル比を持つ携帯電話)を使用している場合、アプリケーションは高いフレームレートを維持するためにシーンのレンダリングに多くの時間を費やしてしまいます。

オーバードローとは、同じ画面領域に対して複数のピクセル層が処理される際に発生するレンダリングの非効率性のことです。これは正当な理由(ブレンドや透過の複数の層)または冗長な理由(より遠いピクセルが手前の不透明なピクセルによって上書きされる)で発生する可能性があります。後者の場合、表示されないピクセルを描画しようとGPU処理を無駄にしていることになります。

ヒント

WebGL Insightのような拡張機能を使用すると、オーバードローを視覚化するのに役立ちます。

ガーベージコレクションによる停止

Webブラウザには、未使用のJavaScriptオブジェクトを自動的にガーベージコレクションする機能があります。PlayCanvasエンジンはランタイムアロケーションを最小限に抑えるように設計されており、あなたのコードでも同様に努めるべきです。ベクトルやその他のオブジェクトを事前に割り当てて再利用することで、毎フレーム多くのオブジェクトが作成されて破棄されることがなくなります。

プロファイリングツール

PlayCanvasには、組み込みのプロファイラツールが付属しています。Editorでは、Launch menuでProfilerオプションを有効にして、プロファイリングを有効にした状態でアプリケーションを実行できます。

一般的な最適化のヒント

さらに多くの最適化ガイドラインが利用可能です。