# リフレクションの最適化

> Speed up baking time and rendering time for Reflection Probes.

リフレクションプローブのキューブマップのレンダリングは、多くの理由によって処理にかなりの時間がかかります。

1. 6 つのキューブマップの面のそれぞれを、プローブの原点に "camera" を使用して個別にレンダリングする必要があります。

2. プローブは、各リフレクションのリフレクションレベルに対し、別々の時間にレンダリングする必要があります (詳細は、[アドバンスドリフレクションプローブ](/engine/6000.0/manual/lighting-overview/reflections/advanced-ref-probe.md)のドキュメントを参照してください)。

3. キューブマップのさまざまな mipmap レベルは、光沢があるリフレクションを可能にするために、ぼかし処理を経なければなりません。

プローブをレンダリングするために要する時間は、エディターのベイクのワークフローだけでなく、より重要なランタイムのプレイヤーのパフォーマンスに影響を与えます。次に、リフレクションプローブがパフォーマンスに与える影響を最小限に保つためのヒントを紹介します。

## 一般的なヒント##general-tips

以下の問題は、オフラインでのベイク*と*ランタイムのパフォーマンスの両方に影響します。

### Resolution##resolution

キューブマップの解像度がより高くなると、そのレンダリング時間はより長くなります。リフレクションの詳細がそれほど重要ではない場所では、解像度をより低く設定するとプローブを最適化することができます (例えば、映り込むオブジェクトが小さい、または遠くにある場合、その詳細は自然と表示されなくなります)。細部をはっきり表示しようとする場合は、解像度を高くする必要があります。

### Culling Mask##culling-mask

法線カメラのパフォーマンスを向上させる標準的なテクニックは、重要でないオブジェクトのレンダリングを避けるために **Culling Mask** プロパティを使用することです。このやり方はリフレクションプローブでも同様に機能します。例えば、シーンに小さなオブジェクト (例えば岩や植物など) が多数含まれている場合は、それらをすべて同じレイヤーに配置し、カリングマスクを使用して、リフレクションでレンダリングしないようにすることができます。

### テクスチャ圧縮##texture-compression

レンダリング時間を最適化し、GPU メモリの消費を抑えるには、テクスチャ圧縮を使用します。ベイクされたリフレクションプローブのテクスチャ圧縮を制御するには、Lighting ウィンドウ (メニュー: **Window** > **Rendering** > **Lighting**) を開き、**Environmental Lighting** > **Reflections** に移動して、**Compression** ドロップダウンメニューを使用します。リアルタイムのリフレクションプローブはメモリ内で圧縮されず、メモリ内のサイズは解像度と HDR の設定に依存することに注意してください。このため、リアルタイムのリフレクションプローブのサンプリングは、通常、ベイクしたリフレクションプローブのサンプリングよりもリソース負荷がかります。

## リアルタイムのプローブの最適化##real-time-probe-optimization

通常は、エディターでベイクされたものよりもリアルタイムプローブの方が、レンダリングのオーバーヘッドは大きくなります。更新が頻繁に行われることがあるため、正しく制御されないとフレームレートに影響を与える可能性があります。このため、リアルタイムプローブには以下のプロパティがあり、プローブのレンダリングをできるだけ効率的に処理できるようになっています。

### Refresh Mode##refresh-mode

**Refresh Mode** は、プローブが更新されたときに選択できます。プロセッサー使用率の点で最もリソースを使用するオプションは、**Every Frame** です。これは、最小限のプログラミング作業で最も頻繁にアップデートを提供しますが、すべてのプローブにこのモードを使用する場合は、パフォーマンスの問題が発生することがあります。

モードが **On Awake** に設定されている場合、プローブは、シーンの開始時に一度だけ、ランタイムに更新されます。シーン (またはその一部) が実行時に設定されますが、その存続期間中に変化しない場合に便利です。

最後の **Via Scripting** では、スクリプトでプローブの更新を制御できます。スクリプトのコーディングにはいくらか手間がかかりますが、このアプローチでは有益な最適化が可能です。例えば、通過するオブジェクトの見かけのサイズに応じてプローブを更新できます (つまり、小さなオブジェクトや、遠くにある大きなオブジェクトの場合は更新する必要はありません)。

### Time Slicing##time-slicing

上記で説明された **Refresh Mode** が **Every Frame** に設定されているとき、処理の負荷が著しく大きくなるかもしれません。**Time Slicing** を使用すると、更新のコストをいくつかのフレームに分散し、それぞれの負荷を削減できます。このプロパティには、3 つの異なるオプションがあります。

1. **All Faces at Once** は、6 つのキューブマップの面を (同じフレーム上で) 即座にレンダリングします。ただし、6 つの 1 番目のレベルのミップマップのぼかし操作は、それぞれ別のフレームで行われます。残りのミップマップは 1 つのフレームでぼかし効果が加えられ、結果は別のフレームのキューブマップにコピーされます。したがって、完全に更新が完了するまでに 9 フレーム必用です。

2. **Individual Faces** は、各キューブマップ面の初期レンダリングが最初のフレームの 6 面すべてではなく独自のフレームで行われることを除いて、**All Faces at Once** と同じように機能します。完全な更新には、完了までに 14 フレームかかります。このオプションはフレームレートに与える影響が最も小さいものの、ライティング条件が突然変化すると (例えば、ランプが突然オンになるなど)、更新時間が相対的に長くなることがあります。

3. **No Time Slicing** は、完全にタイムスライシング操作を無効にしていないので、各プローブの更新は 1 つのフレーム内で行われます。これにより、リフレクションを確実に周辺のオブジェクトの外観と正確に同期させることができますが、処理のコストがひどく高くなるかもしれません。

その他の最適化と同様に、リフレクションがあまり重要でない場所では低品質のオプションを使用し、細部を明確に示す必要のある場所のために **No Time Slicing** オプションの使用を控えることを検討する必要があります。

\--- \*

*
