Version: 2017.2
プロシージャルマテリアル
プロシージャルジオメトリ

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

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

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

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

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

プロシージャルマテリアルのテクスチャを生成した後、ユーザーが1つ以上複数のパラメータ値を変更した場合に、テクスチャ計算の速度を向上させるため、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.ClearCache() を使ってクリアできます。このキャッシュスペースは、ダウンロードしたアセットバンドルデータに使用されるものと同じです。したがって、ClearCache を呼び出すと、キャッシュされたプロシージャルマテリアルのデータ および ダウンロードされたアセットバンドルデータがクリアされます。

プロシージャルマテリアル
プロシージャルジオメトリ