リフレクションプローブのキューブマップのレンダリングは、多くの理由によって処理にかなりの時間がかかります。
プローブの原点にカメラを使用して、6 つのキューブマップの面のそれぞれを個別にレンダリングする必要があります。
プローブは、各リフレクションのリフレクションレベルに対し、別々の時間にレンダリングする必要があります (詳細は、アドバンスドリフレクションプローブ を参照してください)。
キューブマップのさまざまなミップマップレベルは、光沢があるリフレクション (映りこみ) を可能にするために、ぼかし処理を経なければなりません。
プローブをレンダリングするために要する時間は、エディターのベイクのワークフローや、さらに重要なことには、ランタイムのプレイヤーのパフォーマンスに影響を与えます。以下に、リフレクションプローブがパフォーマンスに与える影響を最小限に保つためのヒントを紹介します。
以下の問題は、オフラインでのベイク と 実行時のパフォーマンスの両方に影響します。
キューブマップの解像度がより高くなると、そのレンダリング時間はより長くなります。リフレクションの詳細がそれほど重要ではない場所では、解像度をより低く設定するとプローブを最適化することができます (例えば、映り込むオブジェクトが小さい、または、遠くにある場合、その詳細は自然と表示されなくなります)。詳細をはっきり表示しようとする場合は、解像度を高くする必要があります。
通常のカメラの性能を向上させる標準的な方法は、Culling Mask プロパティを使用して重要でないオブジェクトをレンダリングしないようにします。この方法はリフレクションプローブに対しても同様に有効です。例えば、シーンに多数の小さなオブジェクト (岩や植物など) が含まれている場合は、それらをすべて同じレイヤーに配置し、カリングマスクを使用して、リフレクションにレンダリングすることを避けます。
レンダリング時間を最適化し、GPU メモリの消費を抑えるには、テクスチャ圧縮を使用します。ベイクされたリフレクションプローブのテクスチャ圧縮を制御するには、Lighting ウィンドウ (メニュー: Window > Rendering > Lighting) を開き、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 公開ページ
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.