開発
開発
プラットフォームを選択

VRパフォーマンスの最適化に関するガイドライン

LINK PC-VR DOCUMENTATION
このトピックでは、PC SDKを利用した開発について説明します。Meta Questアプリのパフォーマンスの最適化については、使用する開発プラットフォームに応じて、次のトピックのいずれかをご覧ください。
このセクションでは、VRアプリを効果的に最適化するために従うべき一般的な原則について説明します。

概要

VRアプリの最適化は簡単ではありません。間違った方法を採用してしまうと、コードを最適化したものの、アプリの全体的なパフォーマンスは結局向上しなかったということも起こり得ます。本当のボトルネックがどこにあるかを特定して、そこにフォーカスし、その部分をまず最適化することが重要です。
VRのパフォーマンス問題は、一般にCPUの問題とGPUの問題の2種類に分かれます。CPUは通常、シミュレーションロジック、ステータス管理、レンダリングするシーンの生成に関係する処理を担当します。GPUは通常、シーン内のメッシュのテクスチャーとシェーディングのサンプリングに関係する処理を担当します。パフォーマンスの問題がCPU負荷とGPU負荷のどちらによるものなのかを判断し、それに応じてコードを最適化することが重要です。
原則として、最適化する場合には、並列プログラミングに関する次のアムダールの法則に従います。つまり、「システムを最も利用しているセクションを最適化せよ。処理に大量のリソースを消費するコードパスにフォーカスせよ」というものです。このドキュメントでは、このような問題の箇所をどのように特定したらよいかについて説明します。コストはほぼゼロに抑えても、全体的なパフォーマンスコストを少ししか削減できないような問題にはフォーカスしないでください。
アプリ内の1つの領域がシステムの処理時間の大部分を占有し、残りの領域が消費する割合はかなり小さいということは珍しくありません。まずは問題となるこの大きな領域を最適化することに集中しましょう。
アプリを最適化するときは、一度に1箇所ずつ変更するようにしましょう。特に複雑なVRアプリでは、今回加える変更が前回の変更に大きな影響を及ぼす場合があるので注意してください。アプリのパフォーマンスが低下している原因を突き止めようとする場合、バージョン管理ソフトウェアの履歴で、発生しているパフォーマンスの問題の原因となった1つの変更を特定します。次に、その変更にパフォーマンス問題の根本原因がないか調査します。複数の変更が影響し合って1つのパフォーマンス問題が発生するようになったと決めつけないでください。
多くの場合、物事を杓子定規で考えたり、最終的なパフォーマンスにとってさほど重要ではないことにこだわったりしやすいものです。むしろ、シンプルにタイミングの問題を検討するとうまくいきます。アプリのフレームレートは適正ですか?もし適正なら、コードの設計が理想的ではないとしても、アプリをそれ以上最適化する必要はないかもしれません。ユーザーエクスペリエンスに影響するパフォーマンス問題の本当に重要な面に注意を集中してください。

フレームレートを適正にするためのテクニック

VRでは、各フレームを通常2回(片目に1回ずつ)描画する必要があります。これは、通常すべての描画呼び出しが2回発行され、すべてのメッシュが2回描画され、すべてのテクスチャーが2回バインドされることを意味します。また、最終出力フレームに歪みとTimeWarpを適用するためのオーバーヘッドもわずかですが(おおよそ毎フレーム2ミリ秒)必要です。Riftは90Hzでフレームをリフレッシュするため、安定したフレームレートを維持することは挑戦となる場合があります。
適正なフレームレートを実現するには、次の一般的なガイドラインに従ってください。
  • 各フレームの描画呼び出しを500~1,000回までに制限します
  • 各フレームの三角形または頂点を100万~200万個までに制限します
  • テクスチャーが大きくても、テクスチャーの数はできるだけ少なくします。作業セットを小さくする、テクスチャー圧縮を使用する、そしてミップマップを利用することで、テクスチャーの帯域幅の消費を最小限に抑えることができます。
  • スクリプト(またはその他のロジック)の実行にかかる時間を1~3ミリ秒に制限します(Unity Update()の実行時など)
  • システムでは予想外のことがよく起きるので、プロファイラーを実行して、アプリがリソースをどのように使っているかを常時把握してください。
  • 開発プロセスのごく初期の段階で最適化をしないようにしてください。まずコードをシンプルにします。逆に、明らかにパフォーマンス問題がある場所が見つかったなら、それを無視しないでください。
  • 実績のないテクノロジーや高性能であるという評判のないテクニックに手を出さないでください。
  • すべては相対的です。同一条件で比較してください。
  • 解像度、ハードウェアリソース、画質など、一度に1つずつ変更してみます。
  • ほかのアーティファクトよりも悪質なアーティファクトがあります。グラフィックのクオリティが良くても、コマ落ちしているなら利用者に不快感を与えるため良いとは言えません。
  • レンダリングで適正なフレームレートを得るために、非同期スペースワープ(ASW)に頼らないでください。非同期スペースワープは、アプリがコマ落ちし始めると、直近の頭の姿勢情報に基づいて中間フレームを生成します。これは、直前のフレームを歪めて、より直近の頭の姿勢と一致させるという機能です。非同期スペースワープはたまに起きるコマ落ちを均してはくれますが、Riftストアで要求されている品質をアプリが満たすには、推奨スペックマシンで90フレーム毎秒(FPS)を継続的に実現し、最小スペックマシンで45フレーム毎秒を維持できなければなりません。
  • Riftは高解像度でありGPUに高い負荷をかけるので、モバイルVRデバイスと比べて、CPUがボトルネックになる可能性は低くなります。
  • シンプルなシェーダーと比較的少数のポリゴンで構成されるグラフィックスタイルでも、しばしば写実的なグラフィックと同等のVRエクスペリエンスを提供できます。写実的なグラフィックはたいてい各フレームをレンダリングするために遥かに多くの処理を必要とします。
  • 詳細レベル(LOD)、カリング、バッチ処理などの手法を使ってください。
  • アイバッファを調節し、octilinearレンダリング(NVIDIAレンズマッチングシェーディングを利用)を使うことにより、シェーディングレートを削減します。
  • プロジェクターシャドウを使って帯域幅を節約します。
  • カスケードシャドウマップにレンダリングする際に使う解像度とカスケードの数を検討してください。これによって、帯域幅の消費が増える可能性があるためです。また、帯域幅の消費が多いフィルタリングを使わないようにします。ただし、解像度とカスケードの数を減らすと、すぐに画質が低下する可能性があるため、プロジェクターシャドウを使うことも検討してください。
  • 必要に応じて、簡略シェーダー計算とベイクシェーディングを使います。

パフォーマンス問題の一般的な原因

ほとんどの場合、パフォーマンス問題は下記の原因で発生します(重大度の高い順)。
パフォーマンス問題リソースコスト
シャドウや反射など、依存関係のレンダリングが必要となるシーン
CPU、GPU
描画呼び出しを発行するためのVertex Buffer Objects (VBO)のバインディング
CPU、グラフィックドライバー
透明度、マルチパスシェーダー、ピクセル単位のライティング、多数のピクセルを塗りつぶすその他のエフェクト
GPU
大きなテクスチャーの読み込み、ブリット、その他の形式のmemcpy
GPU、メモリコントローラー
スキンアニメーション
CPU、GPU
Unityガベージコレクションのオーバーヘッド
CPU
ナビゲーションロゴ
日本語
© 2026 Meta