バーチャル テクスチャ システムには GPU メモリ割り当ての主なタイプとして、ページ テーブル メモリと物理メモリ プールの 2 つがあります。
- ページ テーブル メモリ は、テクスチャ座標からテクスチャ データへの間接参照を提供し、オンデマンドで割り当てられます。ページ テーブル メモリは時間の経過とともに増大することがあり、メモリの内容がすべて解放されない限り、通常はメモリから解放されません。このメモリ タイプをユーザーが制御することはできません。
- 物理メモリ プール には、現在常駐しているテクスチャ データが入っており、いくつかの個別のプールで構成されています。バーチャル テクスチャ システムで使用される各テクスチャ形式には、固有のメモリ プールが関連付けられています。各プールは、バーチャル テクスチャの最初のインスタンス化時に、一致する形式で割り当てられています。各プールのサイズは固定であり、増やすことはできません。ユーザーが各プールのサイズを制御できます。
このドキュメントでは、バーチャル テクスチャの物理メモリ プールを定義およびデバッグする方法について説明します。
物理メモリ プールの動作について
物理メモリ プールはそれぞれが複数のページで構成されています。各ページにはバーチャル テクスチャの 1 つのタイルのデータが格納されています。このプールは、最も長く使用されていないキャッシュとして機能します。バーチャル テクスチャ システムがタイルをリクエストすると、プール内の使用可能なページにタイルがストリーミングまたはレンダリングされます。使用可能なページがなければ、最も長く使用されていないタイルが格納されているページが削除されて、新しいページのために領域が空けられます。
バーチャル テクスチャのメモリ プールに収まらない数のバーチャル テクスチャ タイルがビューに表示される場合、システムはそのビューを正しくレンダリングできません。その場合は、バーチャル テクスチャのメモリ プールのサイズを、データ使用量に合わせて調整する必要があります。
物理メモリ プールを構成する
バーチャル テクスチャリング用のメモリ プール サイズは、[Project Settings (プロジェクト設定)] の [Engine (エンジン)] > [Virtual Texture Pool (バーチャル テクスチャ プール)] で設定されています。これらの設定には、次の 2 つのコンフィギュレーション配列が含まれます。

- [Fixed Pools (固定プール)] はシリアル化された設定で、最後の設定から最初の設定へとイテレートし、最初に見つかった一致するコンフィギュレーションを使用します。これらの設定はエディタのセッションをまたいで保持されます。
- [Transient Pools (一時プール)] は、ランタイム時に検出され、プール自動拡張システムによって使用される設定です。バーチャル テクスチャの物理プールでは、プール内のコンフィグレーション設定を検索する前に一致を見つけ出すために、これらのコンフィグレーションが検索されます。一時プールは、現在のエディタ セッションでのみ保持されます。ただし、クック済みのプロジェクトで必要な固定プールの適切な推定サイズとして、一時プールをシリアル化されたプールにコピーすることができます
プールの記述は [Fixed Pools] 配列設定に格納されます。各説明には [Texture Format (テクスチャ形式)] と [Tile Size (タイル サイズ)] が含まれます。次の例には、リストされているテクスチャの各形式 (DXT1、DXT5、BC5) について、特定のプールの記述が含まれています。

さらに、以下の例のように、[Fixed Pools] のインデックスを展開し、[Size in Megabyte (サイズ (メガバイト))] を設定することで、DXT1 テクスチャが格納されているバーチャル テクスチャのすべてのメモリ プールのサイズを 100 メガバイト (MB) に設定できます。このメモリ プールのサイズは近似値であり、システムが割り当てるのは、整数のページ数に収まる平方数で、100 MB 未満で最も大きいプール サイズです。

コンフィギュレーション ファイルで該当するエントリがない形式では、[Default Size in Megabyte (デフォルト サイズ (メガバイト))] のプール サイズが使用されます。
または、デフォルトのプール サイズは、テクスチャ形式が割り当てられていない [Fixed Pools] のエントリを定義することで、表すことができます。
一部のプールには複数のレイヤーがあり、それぞれのレイヤーに固有の形式があります。これは、ほとんどのランタイム バーチャル テクスチャの設定が当てはまります。この場合、プールの記述で、[Format (形式)] 配列を正しく指定する必要があります。たとえば、マテリアルで Base Color、Normal、Roughness、Specular のタイプを使用するランタイム バーチャル テクスチャは、DXT5 テクスチャを使用してデータを格納します。これは、次のような設定になります。

[Fixed Pools] のコンフィギュレーション エントリには、次の設定もあります。
メモリ プールのコンフィギュレーション設定 | 説明 |
---|---|
Allow Size Scale (サイズのスケーリングを許可) | スケーラビリティのコンソール変数 r.VT.PoolSizeScale を使用してメモリ プールのサイズに追加のスケール係数を適用します。 |
Enable Residency Mip Map Bias (常駐ミップマップ バイアスを有効化) | このプールがサブスクリプション超過である場合に、バーチャル テクスチャにミップマップ バイアスが適用されるという動作を有効にします。 |
Min Scaled Size in Megabyte (最小スケール サイズ (メガバイト)) | r.VT.PoolSizeScale のコンソール変数の値が適用された後に、プールに割り当てるサイズの下限を設定します。 |
Max Scaled Size in Megabyte (最大スケール サイズ (メガバイト)) | r.VT.PoolSizeScale のコンソール変数の値が適用された後に、プールに割り当てるサイズの上限を設定します。 |
Pool Auto Grow in Editor (エディタ内のプール自動拡張) 設定が有効な場合、プール サイズは最も高い常駐プールに対応するように増加します。プールが 100% 常駐であることが検出されると、そのサイズは増加し、通知ポップアップがエディタでこの変更を通知します。自動的に増加したプール サイズの設定の検出された変更は、[Transient Pool] 配列コンフィギュレーションに格納されます。
これらの設定は、エディタ セッションをまたいで保持されないため、失われます。このため、プロジェクトにサブスクリプションが超過したプールがあり、[Pool Auto Grow in Editor] がオンになっている場合、エディタを起動するたびにプールが増量することがあります。これを回避するには、[Transient Pool] 設定および [Fixed Pools] 設定の間のエントリをコピー&ペーストすることで、エディタ セッションをまたいで保持することができます。
[Pool Auto Grow in Editor] 設定は、クック済みのビルドには影響しませんが、r.VT.PoolAutoGrow
を設定すると、クック済みのビルドでプール サイズを調整できます。
物理メモリ プールの常駐
バーチャル テクスチャのメモリ プールの現在の使用量は 常駐 と呼ばれます。現在表示されているタイルによって 1 つのプールのすべてのページが割り当てられている場合、常駐は 100% です。
常駐が 100% であれば、プールはオーバーサブスクリプションであり、表示されているタイルのデータがドロップされます。このことにより、メモリでテクスチャ データのロードと削除が繰り返されるので、不要な IO および画面のちらつきが発生します。
メモリ プールがサブスクリプション超過である場合に画面上に通知が表示されるように設定できます。この通知はコンソール コマンド r.VT.Residency.Notify 1
を使用して有効にします。

この警告は、コンフィギュレーション ファイルでメモリ プールのサイズを増やすか、バーチャル テクスチャまたはマテリアルを変更する必要があることを示しています。このような問題の解決に関するヒントについては、以下のセクションを参照してください。
常駐ミップマップ バイアス
bEnableResidencyMipMapBias
設定を有効にしてプールが構成されていれば、プールがオーバーサブスクリプションである場合に常駐を減らすようにミップマップ バイアスが設定されています。この設定により、解像度を下げてバーチャル テクスチャをレンダリングすることで、不要な IO および画面のちらつきが回避されます。
常駐のサブスクリプション超過が生じるのがごくまれであるため、そのためにメモリを割り当てたくない場合に、この設定は役立ちます。オーバーサブスクリプションに対する画面上のメッセージには、適用されているミップマップ バイアスが示されます。
常駐に由来するミップマップ バイアスはグローバルです。すべての物理メモリ プールの現在の最大バイアスは、すべてのバーチャル テクスチャ サンプリングに適用されています。
物理メモリ プールのヘッドアップ ディスプレイ
常駐を監視し、オーバーサブスクリプションの発生を減らすには、適切なメモリ プール サイズを設定することが重要です。画面上のヘッドアップ ディスプレイ (HUD) を使用して、各バーチャル テクスチャの物理メモリ プールの現在の常駐を表示することができます。
この表示を有効にするには、コンソール コマンド r.VT.Residency.Show 1
を実行します。

バーチャル テクスチャの物理メモリ プールの HUD には、各テクスチャ形式の現在の常駐とその割り当て済みメモリが表示されます。

画面上の各グラフは、バーチャル テクスチャの物理メモリ プールのいずれかを表しています。次の 3 つの折れ線グラフがあります。
- 赤色 は現在のプール占有率であり、0 ~ 100% の範囲です。
- 黄色 は固定プール占有率であり、0 ~ 100% の範囲です。
- これは、ロック済みとマークされているページによる占有率です。通常は、仮想テクスチャごとに 1 ページがロックされています。ロード済みの仮想テクスチャ アセットの数が非常に大きいと、その仮想テクスチャが表示されていなくても、利用可能なプール領域が減少することがあります。
- 緑色 は、常駐を 100% 未満に維持するために適用されているミップマップ バイアスです。
物理メモリ プールの常駐をデバッグする
バーチャル テクスチャのメモリ プールがオーバーサブスクリプションである場合にデバッグおよびコンテンツのチェックを開始する必要のある領域を以下に示します。
メモリ プールのサイズ
バーチャル テクスチャのプール サイズに関して、以下の点を確認します。
- プール サイズが、想定されるバーチャル テクスチャ データの完全に機能するセットを保持するのに十分な大きさであることを確認します。
- ページ サイズが大きいプールほど、プール サイズが大きくなっている必要があります。たとえば、テクスチャ形式が
PF_A32B32G32R32F
であるプールは、テキスト形式がPF_DXT1
であるプールよりもメモリ要件がはるかに大きくなります。同様に、複数のレイヤーがあるプールはメモリ要件が増大します。 - 出力解像度が高いレンダリングほど、プール サイズを大きくする必要があります。
- 通常は、出力解像度が高いほど、高い解像度のミップ タイルが必要とされます。
- タイル サイズが大きいほど、必要とされるプール サイズが大きくなります。
- ストリーミング バーチャル テクスチャリング のデフォルトのタイル サイズは 128 テクセルです。ただし、このデフォルト値はオーバーライドできます。
- ランタイム バーチャル テクスチャ のタイル サイズは最大で 1024 テクセルにすることができます。タイル サイズが大きいほど、プール内に無駄な領域が発生しやすくなります。
オーバーサブスクリプション
オーバーサブスクリプションの注目すべき要因の 1 つは、バーチャル テクスチャのサンプリング時にミップ バイアスが負の値であるアプリケーションです。ミップを体系的にサンプリングする際の解像度が高いほど、必要とされるメモリ プールの量が多くなります。ミップ バイアスが負の値であるのは、マテリアル グラフにある Texture Sample ノードでミップ レベルまたはバイアスを明示的に設定しているためです。
オーバーサブスクリプションは、予期しないソースが原因である場合もあります。UV が三角ポリゴンまたはメッシュのインバリアントであるために、ゼロ グラディエントのテクスチャをサンプリングした場合などです。次のマテリアル グラフのスニペットはその例です。この具体的な事例は、Runtime Virtual Texture Sample ノードの Mip Value 設定で「Ignore Input WorldPosition」を使用することによって解決できます。

コンソール コマンド r.VT.DumpPoolUsage
を使用すると、ミップ バイアスや他の問題が原因で想定よりも多くのプール内の領域を占有しているテクスチャを特定できます。このコマンドは、各バーチャル テクスチャ アセットが各メモリ プールで現在割り当てているページの数をダンプします。そのダンプ出力はページ数が多い順に並べられているので、最初のエントリが妥当であるかどうかを確認します。
なお、次のダンプでは、最初のエントリがその他のエントリよりも著しく大きくなっています。そのため、T_Ground_Sand_F_basecolor_CANYON
を参照するマテリアルでミップ バイアスの問題がないかを確認する必要があります。
PhysicaPool: [0] DXT1 (136x136):
T_Ground_Sand_F_basecolor_CANYON 1912
T_Rock_Quarry_Y_RAOD 418
ubulehofw_8K_Albedo 324
pcciQ_4K_Albedo 248
T_Rock_Cliff_D_RAOD 187
noise_directional_3 115
T_column_260_B_W 97
T_column_260_B_goldA_RMAOO 97
T_column_260_B_goldA_C 96