ミップマップストリーミング (ミップマップストリーミング) システムを使うと、Unity による ミップマップ のロードの方法を制御できます。
このページには以下の情報が含まれています。
このシステムの機能を拡張するための API の使用については、ミップマップストリーミングシステム API を参照してください。
このシステムは、デフォルトですべてのミップレベルをロードする代わりに、現在のカメラ位置のレンダリングに必要なミップレベルのみをロードするように強制します。これは、大量の GPU メモリを節約するために、少量の CPU リソースを犠牲にするものです。
アプリケーション内のすべてのテクスチャに対してメモリの総量制限を設定することができ、システムはミップレベルを自動的に削減して、この制限内に収まるようにします。
Unity の Viking Village デモプロジェクトでは、ミップマップストリーミングシステムはカメラの場所に応じて、テクスチャメモリの 25 - 30% を節約します。
ミップマップストリーミングを有効にするには、Unity の Quality Settings (Edit > Project Settings > Quality) を開き、Texture Streaming チェックボックスを有効にします。
この設定を有効にすると、Quality Settings ウィンドウにミップマップストリーミングシステム固有の設定項目が表示されます。各設定の詳細については、Quality Settings のドキュメントを参照してください。
デフォルトでは、これにより、プロジェクト内のすべてのカメラでミップマップストリーミングが有効になります。
これで、個々のテクスチャにミップマップストリーミングを設定することができます。テクスチャアセットを選択し、Inspector ウィンドウに移動し、テクスチャインポートの設定を表示します。Advanced 設定を開き、Streaming Mip Maps チェックボックスを有効にします。
Android 用に開発する場合は、Build Settings (ビルド設定) を開き、Compression Method を LZ4 か LZ4HC に設定する必要があります。 Unity では、ミップマップストリーミングシステムが依存する 非同期テクスチャのロード にそれらの圧縮方法の 1 つが必要です。
Unity は、メモリバジェットを守りつつ、可能な限り高い解像度でミップをロードします。テクスチャの優先順位は、テクスチャインポート設定の Mip Map Priority の設定で設定することができます。
Unity は、この設定を使用して以下を決定します。
正の数は優先度を高くします。有効な値は –128 から 127 までです。
ミップマップストリーミングシステムを使用して、ライトマップのミップレベルをストリーミングすることができます。
ライトマップアセットのミップマップストリーミング設定は、他のテクスチャと同じように編集できますが、Unity がライトマップを再生成するときにデフォルト値にリセットされます。これを解決するには、ライトマップを生成するときにこれらの値を適用するように Unity に指示します。Player Settings (Edit > Project Settings > Player) には、生成されたライトマップのストリーミングと優先度を設定する 2 つのコントロール Lightmap Streaming Enabled と Streaming Priority があります。
ミップマップストリーミングを有効にし優先順位を設定することは、ライトマップに対しても 通常のテクスチャ と同じように動作します。
Unity エディターでデフォルトの設定を行い、必要に応じて ミップマップストリーミング API を使用してこれらの設定をオーバーライドすることができます。
Memory Budget プロパティは、Unity がシーンのテクスチャに使用するメモリの最大量を決定します。メモリバジェットが小さすぎると、Unityはシーン内のテクスチャの解像度を下げてしまいます。これにより、テクスチャがポップしたり、ロードが遅くなったりします。しかし、他のリソースのためのメモリを確保するために、メモリバジェットはできるだけ小さくすべきです。
Quality Settings ウィンドウの Texture Streaming > Memory Budget プロパティで、メモリバジェットを設定します。
メモリバジェットがいっぱいになると、Unity は使用していないミップマップを破棄して、使用する必要があるミップマップのためのスペースを確保します。未使用のミップマップをどれだけ捨てるかは、Max Level Reduction で制御することができます。
この値は、ミップマップストリーミング システムが起動時に最初にロードするミップマップレベルでもあります。例えば、この値を 2 に設定すると、Unity は最初のロード時に最も高い 2 つのミップマップをスキップします。
この値は、Quality Settings ウィンドウの Texture Streaming > Max Level Reduction プロパティで設定します。
ノート: Unity はメモリバジェットよりも Max Level Reduction の値を優先します。例え、テクスチャのメモリがバジェットを超えることになっても、Max Level Reduction の値を超えるミップマップを破棄することはありません。
メモリバジェットには、ミップマップストリーミングを使用しないテクスチャが含まれます。例えば、予算が100MB で、ミップマップストリーミングを使用しないテクスチャが 90MB ある場合、Unity は残りの10 MB にすべてのストリーミングミップマップを収めようとします。それができない場合、低い解像度でロードます。Unity は、例え、メモリバジェットをオーバーしても、ミップマップストリーミングを使用しないテクスチャを常に完全な解像度でロードします。
適切なメモリバジェットは、以下の方法で求められます。
これにより、シーンの中で最もリソースを必要とする領域に利用できる十分なテクスチャメモリが確保され、テクスチャが低解像度に落ちるのを防ぐことができます。メモリに余裕がある場合は、メモリバジェットを大きく設定することで、シーンで表示されていないテクスチャデータをストリーミングキャッシュに残すことができます。
デフォルトで、ミップマップストリーミングシステムを有効にすると、Unity はすべてのカメラに対してこれを有効にします。必要に応じてこの設定を無効にすることができます。
Unity がすべてのカメラのミップマップストリーミングを有効にするかどうかは、Quality Settings ウィンドウの Texture Streaming > Add All Cameras プロパティで設定します。
特定のカメラを除外したい場合は、そのカメラに Streaming Controller コンポーネントを加えてから、無効にします。
Add All Cameras を無効にすると、カメラ毎のミップマップストリーミングを有効にする必要があります。これを行うには、Camera コンポーネント同様に、ゲームオブジェクトに Streaming Controller コンポーネントを加えます。
また、このコンポーネントでは、カメラごとにミップバイアスの設定を調整することができます。
ミップマップストリーミングは、デフォルトで再生モード (Play Mode) で有効になっています。
Unity が再生モードで ミップマップストリーミング を有効にするかどうかは、Editor Settings ウィンドウの Streaming Settings > Enable Texture Streaming in Play Mode プロパティで制御します。
ミップマップストリーミングが再生モードで有効だが編集モードで無効 (もしくはその逆) な場合、再生モードの入/切にかかる時間が若干長くなります。こうすることにより、Unity がミップマップデータをアンロードして再ロードするのを防ぎ、再生モードのワークフローが早くなります。
Unity にはビルトインのミップマップストリーミングデバッグビューモードがあります。それにアクセスするには、シーンビューの描画モードのドロップダウン をクリックし、Texture Streaming を選択します。このビューモードでは、ミップマップストリーミングシステム内でのゲームオブジェクトの状態に応じて、ゲームオブジェクトに以下の色を設定します。
また、デバッグ API を使って、独自のカスタムデバッグツールやビジュアライゼーションを作成することもできます。
重要 : メインテクスチャが MainTexture 属性を使用して設定されている場合は、テクスチャストリーミング デバッグビューモード またはカスタムデバッグツールを使用すると、ゲームビューに表示されません。
ミップマップストリーミングを使用するテクスチャの場合、Unity は以下のいずれかの方法で正しいミップレベルを計算します。
これを行わないと、Unity は正しいミップレベルを計算できず、低品質のミップを使用してテクスチャをロードします。このため、ぼやけた印象になることがあります。
ノート: 以下のシステムは標準の Renderer コンポーネントを使用しません。つまり、これらのシステムで要求されるミップを手動で設定する必要があります。
_ST
値でそのテクスチャの scale と translation を探します。例えば、テクスチャを _ MainTex
を使用してシェーダーで参照する場合、Unity は _ MainTex_ST
を探します。