プロシージャルマテリアル
Procedural Mesh Geometry (プロシージャル メッシュ ジオメトリ)

プロシージャルマテリアル - メモリ使用量とキャッシング挙動

Substance (Unity のプロシージャルマテリアルエンジン)は、二種類のキャッシュを利用します。プロシージャルマテリアルを使う場合、メモリとディスクを管理するために、これら二種類がどのように使われるかを理解することがとても重要です。

1) ‘ランタイム’ メモリキャッシュ

Substance では、少量のデータからダイナミックテクスチャ(パラメータ類にしたがって生成可能なテクスチャ)を生成することができます。ただし、要望のテクスチャを出力するための’再合成’を行う際、Substance はパラメータの値とバイナリデータからテクスチャを生成するために、 ビットマップ形式の中間ファイルを保存するメモリ領域をいくらか必要とします。

テクスチャ生成が ProceduralMaterial.cacheSize から制御されている間、 Substance が使用することを許可するメモリ量

プロシージャルマテリアルのテクスチャを生成した後に、もしもユーザーが一つ又は複数のパラメータの値を変更した場合に、その後のテクスチャ計算の速度を向上させるため、Substance エンジンはキャッシュサイズの現在の値に従ってメモリにいくらか中間値を保存することができます。

終了時に、 ProceduralMaterial.ClearCache() で確保しているメモリ領域と入力用のビットマップデータがあるなら、それが使っているストレージを Substance エンジンに強制的に開放させます。

つまり、手っ取り早く Substance エンジンのメモリ消費量を下げるには、下記のようにテクスチャを計算します。

procMat.cacheSize = ProceduralCacheSize.None;
procMat.ClearCache();
  • この機能はマテリアルごとに呼び出すことが可能なので、そういうものとして考えた方が安全です。しかしながら Substance は、マテリアルの共有部分を再利用してスペースを最適化しようとします(例えば、二つの異なるマテリアルで同じノイズパターンが使用されている等)。加えて、どのアセットがビルド時にシリアライズされ実行時にロードされるか、ゲーム/アプリが実行されるマシンのパフォーマンスによってさえ、アセットのマージは確定的ではありません。マテリアル毎のメモリ使用量を測ろうしているときに、予測できない結果が表示されているなら、この情報はヒントになるでしょう。

2) デバイス上のキャッシュを保存/フラッシュ

ゲーム/アプリを始めた後で、テクスチャ生成に時間をかけないために、プロシージャルマテリアルをキャッシュ読み込みするようにエディター上で設定することができます。

 Substance マテリアルのインスペクターにある Load Behaviour オプション
Substance マテリアルのインスペクターにある Load Behaviour オプション

このオプションでは、初回のテクスチャ生成時(アセットの初回ロード時でも、ユーザーが初めてテクスチャの計算をスクリプトコールから行った時でも、どちらでも)に、生成されたテクスチャをどうキャッシュするか、また、ランタイムで変更や再生成を行うために、サブスタンスのデータをメモリのどこに保存しておくかを、制御できます。

利用可能なオプション

オプション名 説明
Do nothing テクスチャを生成しません。RebuildTextures() や RebuildTexturesImmediately() はテクスチャを生成するために呼び出さなければいけません。
Do nothing and cache テクスチャを生成しません。テクスチャを生成するには RebuildTextures() か RebuildTexturesImmediately() を呼び出す必要があります。一回生成されたテクスチャはディスク/フラッシュにキャッシュされ、後続のゲーム/アプリケーションの起動を高速化します。
Build on level load アプリケーションのサイズに合わせて読み込み時にテクスチャを生成します。(対応プラットフォームのデフォルト)
Build on level load and cache ロード時にテキストを生成し、ディスク/フラッシュメモリにキャッシュして、後続のゲーム/アプリケーションのスタートアップを高速化します。
Bake and keep Substance 読み込みを高速化して Procedual Material データを維持するためにテクスチャをベイクします。これによって後から調整や再生成を行うことが可能になります。
Bake and discard Substance 読み込みを高速化するためにテクスチャをベイクし、Procedural Material データを破棄します。(非対応プラットフォームのデフォルト。)

生成されたテクスチャがデバイス上にキャッシュされると、次回、ゲーム/アプリをコールドスタートした時、テクスチャはディスクから直接ロードされます。また、これは大体において普通のビットマップをロードするのと同じ程度に早いです。つまり、アプリの初回実行時を除き、テクスチャ生成には余計な時間はまったくかからないという事です。

キャッシュしたデータをクリアする

キャッシュされたデータは Caching.CleanCache() を使ってクリアできます。このキャッシュは、他のダウンロードしたアセットバンドルデータが使っているのと同じキャッシュスペースです。なので、 CleanCache をコールすると、キャッシュされたプロシージャルマテリアルデータとダウンロードされたアセットバンドルデータ両方がクリアされます。

プロシージャルマテリアル
Procedural Mesh Geometry (プロシージャル メッシュ ジオメトリ)