Version: 2021.2
フレームデバッガー
Streaming Controller

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

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 MethodLZ4LZ4HC に設定する必要があります。 Unity では、ミップマップストリーミングシステムが依存する 非同期テクスチャのロード にそれらの圧縮方法の 1 つが必要です。

Unity はテクスチャの Memory Budget を観察しながら、可能な限り高い解像度レベルでミップマップを読み込みます。より詳細な制御や、テクスチャストリーミングシステムで自動的に得た結果の微調整を行うには、C# API を使用して各テクスチャのミップマップレベルを指定します。詳細は、ミップマップストリーミング API を参照してください。

制限

以下のいずれかの方法で、ミップマップストリーミングに必要なミップマップレベルの計算をするよう指示できます。

  • 各テクスチャを Unity レンダラーに設定されているマテリアルに割り当てます。
  • Texture2D.requestMipmapLevel を使って手動でミップレベルをリクエストします。

これらの方法のいずれかを使用して、ミップマップレベルを計算するようにミップマップストリーミングに指示しないと、Unity はどのミップレベルを使用するかを計算できません。このことは、Unity が低品質のミップを使用してテクスチャをロードし、ぼやけて見える原因になります。

The following systems don’t use standard Renderers. This means you must manually set the requested mips for these systems or Unity loads the textures they use at low resolution:

  • デカールプロジェクターテクスチャ
  • Reflection probe Textures: Lower resolution mips are a lookup table for roughness. Therefore, if Unity uses a lower mipmap level, it renders materials using the wrong roughness.
  • Textures in Unity’s Terrain system: Unity does not support Mipmap Streaming on Terrain Textures. This is because Terrain Textures need to be available at full resolution at all times to allow Unity to tile and blend the textures.
  • Shaders that handle texture UV coordinates differently from the Unity built-in shaders. Unity always assumes the textures are sampled using UV0 as stored in the Mesh. Unity doesn’t take into account any changes you make to the texture coordinates in the shader or using other texture coordinates like UV1. The only exceptions are changes to scale and translation (see below).

レンダラーがアクティブなとき、レンダラーが使用するメッシュは、望ましいミップマップレベルを計算するために有効な UV 分布メトリクスを必要とします。Unity では、メッシュのインポートプロセスの一環として、自動的に分配メトリクスを計算します。また、Mesh.GetUVDistributionMetric を使って、スクリプトで計算することもできます。

If you create a mesh from code, Unity does not calculate distribution metrics automatically. This causes Unity to load the wrong mipmaps. For example, it may load low-resolution textures when the camera is close to a mesh. 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 mip level. This means you need to set the Texture mip level manually or disable Mipmap Streaming on this Texture. See Texture2D.requestedMipmapLevel for more details on how to manually set which mip level Unity loads.

When Unity calculates the miplevel for a texture it looks for the scale and translation of that texture in a _ST value with the same name as the texture flagged in your shader. For example, if you reference your textures are in the shader using _MainTex, Unity will look for _MainTex_ST.

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

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

  • Green - ミップマップストリーミングシステムによってミップマップが減少したテクスチャ。
  • Red - ミップマップストリーミングシステムにすべてのミップマップをロードするのに十分なリソースがないため、ミップマップがほどんどないテクスチャ。
  • Blue - ストリーミングに設定されていないテクスチャ、またはミップレベルを計算するレンダラーがない場合。

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

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

フレームデバッガー
Streaming Controller