Version: 2023.2
言語: 日本語
ミップマップの基本
ミップマップストリーミングシステム API

ミップマップストリーミングシステム

ミップマップストリーミング (ミップマップストリーミング) システムを使うと、Unity による ミップマップ のロードの方法を制御できます。

このページには以下の情報が含まれています。

このシステムの機能を拡張するための API の使用については、ミップマップストリーミングシステム API を参照してください。

概要

This system forces Unity to only load the mipmap levels needed to render the current Camera position, instead of loading all of them by default. It trades a small amount of CPU resources to save a potentially large amount of GPU memory.

You can set a total memory limit for all textures in an application, and the system automatically reduces mipmap levels to stay within this budget.

Unity の Viking Village デモプロジェクトでは、ミップマップストリーミングシステムはカメラの場所に応じて、テクスチャメモリの 25 - 30% を節約します。

はじめに

ミップマップストリーミングの有効化

ミップマップストリーミングを有効にするには、Unity の Quality Settings (Edit > Project Settings > Quality) を開き、Texture Streaming チェックボックスを有効にします。

この設定を有効にすると、Quality Settings ウィンドウにミップマップストリーミングシステム固有の設定項目が表示されます。各設定の詳細については、Quality Settings のドキュメントを参照してください。

デフォルトでは、これにより、プロジェクト内のすべてのカメラでミップマップストリーミングが有効になります。

ミップマップストリーミングシステムでテクスチャを動作させる

これで、個々のテクスチャにミップマップストリーミングを設定することができます。テクスチャアセットを選択し、Inspector ウィンドウに移動して、テクスチャインポートの設定を表示します。Advanced 設定を開き、Mip Streaming チェックボックスをオンにします。

Android 用に開発する場合は、Build Settings (ビルド設定) を開き、Compression MethodLZ4LZ4HC に設定する必要があります。 Unity では、ミップマップストリーミングシステムが依存する 非同期テクスチャのロード にそれらの圧縮方法の 1 つが必要です。

Unity loads mipmap levels at the highest resolution possible while observing the memory budget. You can configure the priority of a texture with the Mip Streaming > Priority setting in the Texture Import Settings.

Unity は、この設定を使用して以下を決定します。

  • リソースを割り当てる際に、どのテクスチャを優先するか。
  • As a mipmap bias value when choosing a mipmap level that fits in the memory budget. For example, with a priority of 2, the mipmap streaming system tries to use a mipmap two levels higher than Textures with a priority of 0.

正の数は優先度を高くします。有効な値は –128 から 127 までです。

ストリーミングライトマップ

You can use the Mipmap Streaming system to stream mipmap levels for lightmaps.

ライトマップアセットのミップマップストリーミング設定は、他のテクスチャと同じように編集できますが、Unity がライトマップを再生成するときにデフォルト値にリセットされます。これを解決するには、ライトマップを生成するときにこれらの値を適用するように Unity に指示します。Player Settings (Edit > Project Settings > Player) には、生成されたライトマップのストリーミングと優先度を設定する 2 つのコントロール Lightmap Streaming EnabledStreaming 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 は、例え、メモリバジェットをオーバーしても、ミップマップストリーミングを使用しないテクスチャを常に完全な解像度でロードします。

適切なメモリバジェットは、以下の方法で求められます。

  1. プロジェクトの実行中に Texture.destatedTextureMemory の値を確認します。
  2. Memory Budget の値を Texture.destablishedTextureMemory の値よりもわずかに高く設定します。

これにより、シーンの中で最もリソースを必要とする領域に利用できる十分なテクスチャメモリが確保され、テクスチャが低解像度に落ちるのを防ぐことができます。メモリに余裕がある場合は、メモリバジェットを大きく設定することで、シーンで表示されていないテクスチャデータをストリーミングキャッシュに残すことができます。

カメラの設定

デフォルトで、ミップマップストリーミングシステムを有効にすると、Unity はすべてのカメラに対してこれを有効にします。必要に応じてこの設定を無効にすることができます。

Unity がすべてのカメラのミップマップストリーミングを有効にするかどうかは、Quality Settings ウィンドウの Texture Streaming > Add All Cameras プロパティで設定します。

特定のカメラを除外したい場合は、そのカメラに Streaming Controller コンポーネントを加えてから、無効にします。

Add All Cameras を無効にすると、カメラ毎のミップマップストリーミングを有効にする必要があります。これを行うには、Camera コンポーネント同様に、ゲームオブジェクトに Streaming Controller コンポーネントを加えます。

This component also allows you to adjust the mipmap bias setting per-Camera.

Streaming Controller コンポーネント
Streaming Controller コンポーネント

エディターストリーミングの設定

Edit > Project Settings > Editor にあるストリーミング設定
Edit > Project Settings > Editor にあるストリーミング設定

エディターの Mipmap Streaming (テクスチャストリーミングとも呼ばれます) はデフォルトで有効ですが、品質設定Texture Streaming を有効にし、テクスチャアセットのインポート設定 の 1 つ以上で Mipmap Streaming を有効にした場合にのみ有効になります。

Unity がエディターで再生モードと編集モードの両方で Mipmap Streaming を使用するかどうかは、独立してコントロールできます。これを行うには、Project Settings > Editor > Streaming Settings に移動します。

エディターで片方のモードで Mipmap Streaming を有効にし、もう片方のモードで Mipmap Streaming を有効にしない場合は、プレイモードへの切り替えと終了に若干時間がかかります。両方のモードで Mipmap Streaming を有効にすると、Unity がミップマップデータをアンロードしてリロードすることがなくなり、Play モードへの切り替えと終了のスピードが上がります。

The “Load texture data on demand” setting enables further optimizations in the Editor for textures which have mipmap streaming enabled, which:

  • テクスチャデータをディスクからメモリに非同期にロードします
  • Only loads the mipmap levels required by current camera views
  • 現在の品質設定のテクスチャストリーミングメモリバジェットの範囲内で動作しようとします

These optimizations avoid some stalls, make loading slightly faster, and reduce the amount of CPU memory used. However, this setting can cause mipmapped textures to temporarily appear at a lower resolution than they should while a higher resolution version is loaded in. This feature incurs some overhead on the CPU, so you might want to leave this disabled if your textures all fit in memory at once, or you don’t have any textures set up to stream.

ミップマップストリーミングのデバッグ

Unity にはビルトインのミップマップストリーミングデバッグビューモードがあります。それにアクセスするには、シーンビューの描画モードのドロップダウン をクリックし、Texture Streaming を選択します。このビューモードでは、ミップマップストリーミングシステム内でのゲームオブジェクトの状態に応じて、ゲームオブジェクトに以下の色を設定します。

  • Green - ミップマップストリーミングシステムによってミップマップが減少したテクスチャ。
  • Red - ミップマップストリーミングシステムにすべてのミップマップをロードするのに十分なリソースがないため、ミップマップがほどんどないテクスチャ。
  • Blue for Textures that are not set to stream, or if there is no renderer calculating the mipmap levels.

また、デバッグ API を使って、独自のカスタムデバッグツールやビジュアライゼーションを作成することもできます。

重要: メインテクスチャが MainTexture 属性を使用して設定されている場合は、テクスチャストリーミング デバッグビューモード またはカスタムデバッグツールを使用すると、ゲームビューに表示されません。

How Unity calculates the required mipmap level

For textures that use Mipmap Streaming, Unity calculates the correct mipmap level using one of the following methods:

  • If you assign the texture to a material that is used by a Unity Renderer componennt, Unity calculates the mipmap level automatically.
  • Otherwise, you must request mipmap levels manually using Texture2D.requestedMipmapLevel.

If you don’t do this, Unity can’t calculate the correct mipmap level, and it loads the texture using low-resolution mipmap levels. These can appear blurry.

Note: The following systems don’t use standard Renderer components. This means you must manually set the requested mipmap levels for these systems:

  • デカールプロジェクターテクスチャ
  • Reflection probe textures: Lower resolution mipmap levels are a lookup table for roughness. Therefore, if Unity uses a lower mipmap level, it renders materials using the wrong roughness.
  • Mesh.uv (UV0 とも呼ばれる) 以外のチャンネルで UV テクスチャ座標を使用するシェーダー、またはシェーダーでテクスチャ座標を変更するシェーダー。唯一の例外は、スケールとトランスレーションの変更 (下記参照)。

制限

  • Unity はTerrain (地形) テクスチャ のミップマップストリーミングをサポートしていません。これは、Unity がテクスチャをタイル化してブレンドするために、Terrain (地形) テクスチャが常にフル解像度で利用可能である必要があるためです。
  • When a Renderer component is active, its mesh requires valid UV distribution metrics to calculate the desired mipmap level. Unity calculates distribution metrics automatically as part of the mesh importing process.

    If you create a mesh from code, Unity does not calculate distribution metrics automatically and therefore it loads the wrong mipmap levels. To manually trigger the UV distribution metric calculation use Mesh.RecalculateUVDistributionMetrics.
  • When Unity renders a streamed Texture directly with an API (such as Graphics.DrawMeshNow) the system has no renderer bounds or other information to calculate the mipmap level. This means you need to set the Texture mipmap level manually or disable Mipmap Streaming on this Texture. See Texture2D.requestedMipmapLevel for more details on how to manually set which mipmap level Unity loads.
  • Unity がテクスチャのミップレベルを計算する場合、シェーダーでフラグが立てられたテクスチャと同じ名前の _ST 値でそのテクスチャの scale と translation を探します。例えば、テクスチャを _ MainTex を使用してシェーダーで参照する場合、Unity は _ MainTex_ST を探します。
ミップマップの基本
ミップマップストリーミングシステム API