Version: 2021.1
言語: 日本語
Streaming Controller
物理演算

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

このページは以下について説明します。

概要

API を使用して、Unity がテクスチャをストリーミングする方法をより細かく制御できます。ミップマップストリーミングシステムが自動的にすべてのテクスチャを管理する一方で、特定のテクスチャに対してロードするミップマップレベルをオーバーライドすることができます。特定のテクスチャを完全にロードする必要があるとわかっている特定のゲームシナリオがあるかもしれません。例えば、大きな距離を素早く動かしたり、瞬間的なカメラカットを使用すると、ミップマップストリーミングシステムがミップマップをディスクからメモリにストリーミングするときに、テクスチャの質に著しい変化を引き起こす可能性があります。この問題を軽減するために、API を使用して新しいカメラ位置でミップマップをプリロードすることができます。

テクスチャのミップマップストリーミングを有効にして制御するには、以下のプロパティを使用します。

ミップマップストリーミングは、テクスチャのサイズをミップマップストリーミングの Memory Budget (メモリバジェット) に収まるように自動的に縮小します。テクスチャの Mip Map Priority (ミップマップ優先順位) の数字はおおむね Memory Budget のミップマップオフセットに当たります。例えば、優先順位が 2 の場合、ミップマップストリーミングシステムは、優先順位が 0 の他のテクスチャよりミップレベルが 2 つ高いミップマップを使用しようとします。負の値も有効です。これを行うことができない場合は、Memory Budget に合うように低いミップレベルを使用します。

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

これらのプロパティは、実行時には読み取り専用になります。

ランタイムに発生する処理を制御するには、以下の静的プロパティを使用します。

メモリバジェットの設定

Memory Budget プロパティは、Unity がシーンのテクスチャに使用するメモリの最大量を決定します。デフォルトでは、512MBに設定されています。 Memory Budget は、テクスチャストリーミングを使用する際に、シーンに大きな影響を与えます。メモリバジェットが小さすぎると、Unityはシーン内のテクスチャの解像度を下げてしまいます。これにより、テクスチャがポップしたり、ロードが遅くなったりします。しかし、他のリソースのためのメモリを確保するために、メモリバジェットはできるだけ小さくすべきです。

メモリバジェットを把握するために以下を行います。

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

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

ミップマップストリーミングのカメラの制御

Quality Settings (Edit > Project Settings > Quality) で Add All Cameras を使用して、プロジェクト内のすべてのカメラのミップマップストリーミングを計算するかどうかを指定します。これはデフォルトで有効になっています。

どのカメラをアクティブにするかを細かく制御するには、Camera コンポーネントがアタッチされているゲームオブジェクトの Streaming Controller コンポーネントを使用します。これにより、Camera コンポーネントから位置やカメラ設定 (Field of View など) を直接取得します。

カメラが無効になっている場合、Streaming Controller が有効でプリロード状態でない限り、Unity はミップマップストリーミングを計算しません。Streaming Controller と、その紐付けられたカメラが有効になっている場合、または Streaming Controller がプリロード状態の場合、Unity はこのカメラのミップマップストリーミングを計算します。Streaming Controller が無効の場合は、Unity はこのカメラのミップマップストリーミングを計算しません。

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

Streaming Controller コンポーネントには Mip Map Bias 設定が含まれています。これを API で制御するには、StreamingController.streamingMipmapBias を使用します。

ミップマップストリーミングシステムがテクスチャに対して選択したミップマップレベルより小さい、または大きいミップマップレベルを強制的に読み込ませるには、この設定を使用します。数値フィールドを使用して、Unity がミップマップレベルに適用するオフセットを設定します。このオフセットは、このカメラから見えるすべてのテクスチャに加えられます。

カメラカット

ある場所のカットから別の場所のカットに切り替えるとき、ミップマップストリーミングシステムは必要なテクスチャを Unity にストリーミングする時間が必要です。無効にしたターゲットカメラの位置でプリロードをトリガーするには、ターゲットのカメラの Streaming Controller コンポーネントの StreamingController.SetPreloading を呼び出します。タイムアウトを指定して、プリロードのフェーズを終了できます。プリロードフェーズの終了時にカメラを自動的にアクティブにするには、スクリプトの activateCameraOnTimeout フラグを true に設定します。カメラを新しいカメラに切り替えた後に非アクティブにするには、そのカメラに disableCameraCuttingFrom パラメーターを渡します。

void StreamingController.SetPreloading(float timeoutSeconds=0.0f, bool activateCameraOnTimeout=false, Camera disableCameraCuttingFrom=null)

プリロード状態をキャンセルまたはクエリするには、以下のメソッドを使用します。

ミップマップストリーミングシステムが依然としてテクスチャをロードしているかどうかを判断するには、以下のプロパティをクエリできます。

カメラをアクティブにしてから、プロパティーが 0 以外の値になるまでに時間がかかることに注意してください。この遅延は、ミップマップストリーミングシステムがタイムスライス処理を使用してミップマップを計算するためです。このため、カメラカットの最中には、カットする前に最小限の時間待つ必要があります。テクスチャのバジェットとシーンの動きは連続的なミップマップストリーミングを引き起こす場合があります。そのため、カット前の最大時間も設定する必要があります。

特定のミップマップのロード

特定テクスチャのミップレベルの計算をオーバーライドするには、Texture2D.requestedMipmapLevel を使用します。これは、その特定テクスチャの 0 から最大の範囲内で設定できる正確なミップレベルです。または、それより低い場合は Max Level Reduction 値を使用します。0 が最高解像度ミップレベルです。

要求されたミップレベルがロードされているかどうかを確認するには、Texture2D.IsRequestedMipmapLevelLoaded を使用します。

リクエストしたミップレベルでのオーバーライドを止め、システムにミップマップレベルを計算させたい場合は、Texture2D.ClearRequestedMipmapLevel を使用して値をリセットします。

メッシュの UV 密度の推定値を取得するには、以下を使用します。

float Mesh.GetUVDistributionMetric(int uvSetIndex)

UV 分布メトリックを使用すると、カメラの位置に基づいて、必要なミップマップレベルを計算することができます。コードサンプルは Mesh.GetUVDistributionMetric を参照してください。

システムをオーバーライドしてすべてのミップを強制的にロードするには、Texture.streamingTextureForceLoadAll を使用します。

関連 API メソッド

マテリアルに割り当てられたテクスチャを取得および設定するには、以下を使用します。

マテリアルのすべてのテクスチャプロパティを取得するには、以下を使用します。

デバッグまたはプロファイリング API

デバッグ用のビジュアライゼーションを作成するために使用するマテリアルプロパティで、テクスチャごとのストリーミング情報を取得するには、Texture.SetStomengTextureMaterialDebugProperties を使用します。

You can use Texture.SetStreamingTextureMaterialDebugProperties] to assign streaming status information for each texture to material properties. You can then use these properties in the shader to create debug visualizations.

また、これらのプロパティを使用して、プロジェクト用のミップマップストリーミングプロファイリングおよびデバッグツールを作成することも可能です。

ミップマップストリーミングシステムが相互作用するテクスチャやレンダラーの数に関する情報を取得するには、以下のプロパティを使用します。

テクスチャのミップマップレベルに関する情報を取得するには、以下のプロパティを使用します。

ライトマップ

ミップマップストリーミングシステムを使用してライトマップをストリーミングできます。テクスチャ設定は直接編集できますが、Unity がライトマップを再生成するときにデフォルト値にリセットされます。Player 設定 (Edit > Project Settings > Player) には、生成されたライトマップのストリーミングと優先度を制御できる 2 つの設定があります。Lightmap Streaming EnabledStreaming Priority です。

Edit > Project Settings > Player > Other Settings
Edit > Project Settings > Player > Other Settings

再生モード

ミップマップストリーミングは、デフォルトでは再生モードでアクティブになっています。ただし、再生モードで実行している場合、エディターのオーバーヘッドは統計にバイアスを生じさせます。正確な数値を取得するには、ターゲットデバイスでアプリケーションをテストします。

ミップマップストリーミングが再生モードで有効だが編集モードで無効 (もしくはその逆) な場合、再生モードの入/切にかかる時間が若干長くなります。再生モードでミップマップストリーミングの使用を止めるには、エディター設定 (Edit > Project Settings > Editor) に移動し、Streaming Settings に移動し、Enabled Texture Streaming in Play Mode を無効にします。こうすることにより、Unity がミップマップデータをアンロードして再ロードするのを防ぎ、再生モードのワークフローが早くなります。

Edit > Project Settings > Editor > Streaming Settings
Edit > Project Settings > Editor > Streaming Settings
Streaming Controller
物理演算