リフレクションプローブのキューブマップのレンダリングは、多くの理由によって処理にかなりの時間がかかります。
プローブの原点にカメラを使用して、6 つのキューブマップの面のそれぞれを個別にレンダリングする必要があります。
プローブは、各リフレクションのリフレクションレベルに対し、別々の時間にレンダリングする必要があります (詳細は、アドバンスドリフレクションプローブ を参照してください)。
キューブマップのさまざまなミップマップレベルは、光沢があるリフレクション (映りこみ) を可能にするために、ぼかし処理を経なければなりません。
プローブをレンダリングするために要する時間は、エディターのベイクのワークフローや、さらに重要なことには、ランタイムのプレイヤーのパフォーマンスに影響を与えます。以下に、リフレクションプローブがパフォーマンスに与える影響を最小限に保つためのヒントを紹介します。
以下の問題は、オフラインでのベイク と 実行時のパフォーマンスの両方に影響します。
キューブマップの解像度がより高くなると、そのレンダリング時間はより長くなります。リフレクションの詳細がそれほど重要ではない場所では、解像度をより低く設定するとプローブを最適化することができます (例えば、映り込むオブジェクトが小さい、または、遠くにある場合、その詳細は自然と表示されなくなります)。詳細をはっきり表示しようとする場合は、解像度を高くする必要があります。
通常のカメラの性能を向上させる標準的な方法は、Culling Mask プロパティを使用して重要でないオブジェクトをレンダリングしないようにします。この方法はリフレクションプローブに対しても同様に有効です。例えば、シーンに多数の小さなオブジェクト (岩や植物など) が含まれている場合は、それらをすべて同じレイヤーに配置し、カリングマスクを使用して、リフレクションにレンダリングすることを避けます。
レンダリング時間を最適化し GPU メモリ消費を減らすには、テクスチャ圧縮を使用します。ベイクしたリフレクションプローブのテクスチャ圧縮を制御するには、 Lighting ウィンドウ (Window > Rendering > Lighting Settings) を開き、Environmental Lighting > Reflections と移動し、 Compression ドロップダウンを使用します。リアルタイムのリフレクションプローブはメモリで圧縮されておらず、メモリ内のサイズは解像度と HDR の設定に依存します。このため、リアルタイムのリフレクションプローブのサンプリングは、通常は、ベイクしたリフレクションプローブのサンプリングよりもリソースに負担がかかります。
通常は、エディターでベイクしたものよりもリアルタイムプローブの方が、レンダリングのオーバーヘッドは大きくなります。更新が頻繁に行われることがあるため、正しく制御されないと、フレームレートに影響を与える可能性があります。このためリアルタイムプローブには後述のプロパティがあり、プローブのレンダリングをできるだけ効率的に処理できるようになっています。
Refresh Mode によって、いつプローブを更新するかを選択できます。処理時間的にもっともリソースに負担がかかるのは、Every Frame です。このオプションは、少ないプログラムの手間で、もっとも頻繁に更新できます。ただし、すべてのプローブにこのモードを使うとパフォーマンス上の問題が発生する場合があります。
モードを On Awake に設定すると、プローブはランタイムに更新されますが、シーンの開始時に 1 回だけです。これは、シーンがランタイムに設定される場合は有用です。しかし、生存期間中に変更することはできません。
最後の Via Scripting では、スクリプトでプローブの更新を制御できます。スクリプトのコーディングにはいくらか手間がかかりますが、このアプローチでは有用な最適化が可能です。例えば、通過するオブジェクトの見かけのサイズに応じてプローブを更新することができます (つまり、小さなオブジェクトや、遠くにある大きなオブジェクトの場合は更新する必用はありません)。
前述の Refresh Mode を Every Frame に設定するとき、処理負荷は大きくなります。Time Slicing を使用すると、更新のコストをいくつかのフレームに分散し、それぞれの負荷を削減できます。このプロパティには 3 つの異なるオプションがあります。
All Faces at Once は、6 つのキューブマップの面を (同じフレーム上で) 即座にレンダリングします。ただし、6 つの 1 番目のレベルのミップマップのぼかし操作は、それぞれ別のフレームで行われます。残りのミップマップは 1 つのフレームでぼかし効果が加えられ、結果は別のフレームのキューマップにコピーされます。したがって、完全に更新が完了するのに 9 フレーム必用です。
Individual Faces は、All Faces at Once と同様に挙動しますが、(6 面すべてを最初のフレームで行うのではなく) 各キューブマップ面のレンダリングはそれぞれのフレームで行われます。完全なアップデートには 14 フレームが必要です。このオプションはフレームレートに最も低い影響を与えますが、ライティング条件が突然変化すると (例えば、ランプが突然オンになるなど)、更新時間が相対的に長くなることがあります。
No Time Slicing はタイムスライス操作を完全に無効にし、各プローブの更新が 1 つのフレーム内で行われるようにします。これにより、リフレクションが周囲のオブジェクトの外観と正確に同期することが保証されますが、処理コストが高くなる可能性があります。
他の最適化同様、リフレクションがあまり重要でない場合は、クオリティを低めにするようにし、詳細も表示されるような場合にのみ No Time Slicing オプションを使用するようにします。
バージョン 5.6 で更新
2017–06–06 公開ページ