Mip Map Streaming (ミップマップストリーミング) システムは、Unity がメモリにロードするミップマップレベルを制御します。このシステムは Unity がテクスチャのために必要な合計メモリ量を削減します。なぜなら、ミップマップストリーミングシステムは、デフォルトでシーン内のすべてのミップマップをロードするのではなく、シーンの現在のカメラ位置のレンダリングに必要なミップマップのみをロードするからです。これにより、少量の CPU リソースと引き換えに、多くの GPU メモリを節約することが可能です。
ミップマップストリーミングの Memory Budget (メモリバジェット) を使用して、プロジェクトで使用するすべてのテクスチャの合計メモリ量を設定することもできます。ミップマップストリーミングシステムは自動的にミップマップレベルを下げてこの設定内に留めます。
ミップマップストリーミング API を使用して、特定のテクスチャに特定のミップマップレベルをリクエストできます。Unity は、ミップマップ選択のためのエンジンロジックを複製するサンプルの C# コードを提供しています。これを使用して、プロジェクトのためにエンジンロジックをオーバーライドできます。詳細は、ミップマップストリーミング API を参照してください。
Unity の Viking Village デモプロジェクトでは、ミップマップストリーミングはカメラの場所に応じて、テクスチャメモリの 25 - 30% を節約します。
ミップマップストリーミングを有効にするには、Unity の Quality 設定 (Edit > Project Settings > Quality) に移動し、Texture Streaming チェックボックスをチェックします。これにより、ミップマップストリーミングシステム特有の設定が表示されます。各設定の詳細は、Quality 設定 を参照してください。
これを行うと、個々のテクスチャにミップマップストリーミングを設定し、ミップマップストリーミングシステムが各テクスチャのミップマップをディスクからメモリにストリーミングできるようにします。これを行うには、ミップマップストリーミングを適用するテクスチャを選択し、インスペクターウィンドウに移動し、テクスチャインポートの設定を表示します。 Advanced 設定を開き、Streaming Mip Maps チェックボックスにチェックします。
Android 用に開発する場合は、Build Settings (ビルド設定) を開き、Compression Method を LZ4 か LZ4HC に設定する必要があります。 Unity では、ミップマップストリーミングシステムが依存する 非同期テクスチャのロード にそれらの圧縮方法の 1 つが必要です。
Unity はテクスチャの Memory Budget を観察しながら、可能な限り高い解像度レベルでミップマップを読み込みます。より詳細な制御や、テクスチャストリーミングシステムで自動的に得た結果の微調整を行うには、C# API を使用して各テクスチャのミップマップレベルを指定します。詳細は、ミップマップストリーミング API を参照してください。
For Mip Map Streaming, you need to assign each Texture to a Unity Renderer to allow the system to calculate the required mip level, unless a script requests manual mip levels (see documentation on Texture2D.requestedMipmapLevel). If you do not assign a Texture to a Renderer (and do not set a manually requested mip), the system cannot calculate what mip to use. This results in Unity loading the Texture with reduced mips, which look blurry when close to the Camera.
The following systems don’t use standard Renderers, so you should disable Mip Map Streaming on Textures associated with them:
When Unity renders a streamed Texture directly with an API (such as Graphics.DrawMeshNow) the system has no renderer bounds information to calculate the mip level, so you need to set the Texture mip level explicitly (or disable Mip Map Streaming on this Texture). See documentation on Texture2D.requestedMipmapLevel for more details.