
VR/AR 体験の最適化
Tutorial
Beginner
+10XP
40 mins
Unity Technologies

本チュートリアルでは、Unity で VR や AR 体験を最適化する方法を学びます。
Languages available:
1. VR/AR 体験の最適化
検証済み:2019.4 LTS
XR アプリケーションで快適性と安全性を確保するためには、最適化が重要な要素となります。特にバーチャルリアリティでは、アプリケーションが高いフレームレートを維持することが重要です。CPU や GPU に負荷がかかると、フレームレートが下がり、ユーザーが乗り物酔いをする可能性があります。
重要な指標のひとつにドローコールがあります。ゲームオブジェクトを画面に描画するために、エンジンはグラフィックス API にドローコールを発行する必要があります。ドローコールはリソースを大量に消費することが多く、グラフィックス API はドローコールのたびに多大な作業を行うため、CPU 側のパフォーマンスのオーバーヘッドの原因となります。これは主に、ドローコール間の状態変化(異なるマテリアルへの切り替えなど)により、グラフィックスドライバーでリソースを消費する検証や変換ステップが発生するためです。
CPU や GPU の計算負荷を軽減するために、ドローコールやトライカウントはできるだけ少なくしたいものです。
アプリケーションを最適化する際には、いくつかのわかりやすいテクニックを実装する必要があります。このチュートリアルでは、Unity アプリケーションを最適化するための標準的なテクニックや戦略をいくつか紹介します。テクニックは以下の通りです:
1. ライトベイキング (Light baking)
2. オクルージョンカリング (Occlusion culling)
3. 静的バッチ処理 (Static batching)
4. 品質設定 (Quality settings)
5. レンダリングパスのタイプ:シングルパス (vs. マルチパス)
ライトベイキングを使うことで、シーンをレンダリングする際の計算コストを削減します。この技術は GPU を助けるもので、ランタイム前にシーンのイルミネーションを事前に計算するプロセスを指します。これは、ベイクしたライトのランタイムオーバーヘッドがないことを意味しています。通常、Unity は各オブジェクトを、それを照らすすべてのライトに対してレンダリングします。つまり、あるオブジェクトに 5つのライトがある場合、Unity はそのオブジェクトを 5回レンダリングします(ビューの場合)。これにより、トライカウントやドローコールの数が急増し、アプリケーションのパフォーマンスが低下します。これらの計算はランタイム前に行われるため、ライトをベイクすることは、トライ数やドローコールの数を減らす効果的な方法です (画像 01)。
また、GPU の負荷を軽減するためのテクニックとして、オクルージョンカリング (Occlusion Culling) があります。オクルージョンカリングは、Camera ゲームオブジェクトの視界の外にあるオブジェクトを Unity がレンダリングしないようにします。デフォルトでは、Unity はの視錐台の外にあるオブジェクトをレンダリングしません。しかし、前景のオブジェクトに遮られてレンダリングされるため、オーバードローやピクセルのオーバーラップ(ピクセルが 2 回重なって描かれること)が発生します。このピクセルの重複は不要な作業であり、避けなければなりません。これを避けるには、オクルージョンカリングを使って、他のオブジェクトに覆われたオブジェクトを「カリング」します (画像 02)。
静的バッチ処理を使うと、GPU と CPU の両方のパフォーマンスを向上させます。静止しているオブジェクトをすべてスタティックにすることで、Unity は静止しているゲームオブジェクトを 1つの大きなメッシュにまとめ、レンダリングを高速化します。これにより、ドローコールや物理計算も削減されます。オブジェクトに static のタグを付けることで、Unity はこれらのオブジェクトが決して動かないことを認識し、物理計算に含める必要がありません。アプリケーションが CPU に負荷をかけている場合、より多くのオブジェクトをスタティックとしてマークすることは有用なテクニックです。
品質設定 (画像 03) は、レンダリングされるオブジェクトのグラフィック品質を制御します (メニュー:Edit > Project Settings > Quality)。これらの設定(ピクセルライト数、ライトマップの解像度など)は、グラフィック品質を最大限に高めるか、パフォーマンスを最大限に高めるかのどちらかになります (画像 04)。グラフィックスの品質が低いほど、パフォーマンスは高くなります。
そして最後に、レンダリング方法の調整です。現在、Unity は XR の 3 つのレンダリング方法をサポートしています:
- マルチパス
- シングルパス
- シングルパスインスタンシング
シングルパスインスタンシングは、3 つの中で最もパフォーマンスが高いですが、すべてのデバイスで利用できるわけではありません。
Google VR では目ごとに 2 つのテクスチャが用意されているため、Unity ではシーンを 2 回レンダリングする必要があります (画像 05)。マルチパスのレンダリングでは、影のようにそれぞれの目に必要な作業を重複させないようにしており、2 回レンダリングする必要はありません。マルチパスでは、ほとんどのオブジェクトは 2 回レンダリングされますが、シーングラフのレンダリングは 1 回です。これにより、より正確なライティングが可能になりますが、2 つのレンダリングがテクスチャ間で GPU 作業を共有していないため、計算コストがかかります。これは最も効率の悪いレンダリングパスですが、ほとんどのデバイスで動作します。
一方、シングルパスは、2 つのテクスチャを 1 つの大きなテクスチャ (ダブルワイドテクスチャと呼ばれる)にパックします。これはシーングラフを一度だけ通過するので、CPU 上では非常に高速です。ただし、これを実行するには、多くの GPU 状態変更が追加で必要になります。
シングルパスインスタンシングにより、さらにシンプルな統合が可能になり、パフォーマンスも向上します。シングルパスと同様に CPU のオーバーヘッドを削減し(ドローコールの数を減らす)、シングルパスよりも GPU のオーバーヘッドを削減することができます。GPU は、より効率的に描画を処理することができ、従来のシングルパスとは異なり、描画の間にビューポートを変更する必要がないため、ステート(状態)の更新を最小限に抑えることができます。
シングルパスインスタンシングについてはこちらをご覧ください。
2. ライトベイキングの設定
1. シーン内の動かないオブジェクトをすべて「Static」に設定してください。これにより、ライティングの計算にオブジェクトを含めることができます。
2. シーンの各ライトモードを Baked に変更します (画像 07)。
3. Lighting 設定ウィンドウで、Generate Lighting をクリック(または「B」がチェックされていることを確認)します。
4. エディターの右下にあるステータスバーにプログレスバーが表示されます。
5. ベイキングが完了すると、Lighting ウィンドウの Global Maps タブと Object Maps タブに、ベイクしたすべてのライトマップが表示されます。
6. ライティングの精度を上げるために、ライトマップのサイズを調整してみてください。これにより、ベイク時間とビルドファイルのサイズが増加しますが、ライティングの精度も向上します。
3. オクルージョンカリングの設定
1. 他のオブジェクトを遮っているすべてのオブジェクトに Occluder Static、小さくて遮られているすべてのオブジェクトに Occludee Static のタグを付けます。最も早い方法は、オクルージョン計算に含めたいオブジェクトを複数選択して、適切にタグ付けすることです。
2. ウィンドウをレンダリングする場合は、ウィンドウを Occludee Static とタグ付けすると、背後のオブジェクトを遮りません。
3. Occlusion ウィンドウを開きます (Window > Rendering > Occlusion Culling)。
4. Occlusion Culling - Bake タブを開き、Bake をクリックします。これでオクルージョンマップがベイクされ、オクルージョンカリングが正しく動作するようになります (画像 08)。
4. 静的バッチ処理の設定
1. Player Settings に移動します (Edit > Project Settings > Player)。
2. Static Batching を有効にします (画像 09)。
3. Hierarchy の中で、動かないオブジェクト (static objects) をすべて選択し、Batching Static というタグを付けます。注:一般的には、チェックボックスをトグルすると、すべての Static タグにトグルされます (画像 10)。
5. 品質設定を行う
1. Quality 設定に移動します (Edit > Project Settings > Quality)
2. パフォーマンスを最大限に高めるには、Fastest を選択します (画像 11)。
3. プリセットの下にある調整済みの品質設定を見てみましょう。
6. レンダリングパスのタイプごとの設定
1. シングルパスまたはシングルパスインスタンシングを有効にするには、Project Settings に移動します。
2. Player カテゴリーを選択します。
3. 下部の XR Settings パネルに移動します。
4. Virtual Reality Supported オプションにチェックを入れます。
5. Stereo Rendering Mode ドロップダウンメニューから Single Pass Instanced を選択します (画像 12)。
7. まとめ
これらの 5 つのテクニックは、VR/AR プロジェクトにおいて、既存のアセットを変更することなく、パフォーマンスの低下(ユーザーを不安にさせる可能性)を抑えることができます。これらは、VR/AR の開発には欠かせませんが、モバイル、コンソール、デスクトップアプリケーションでも採用することができます。