Zen Loader は Unreal Engine 5(UE5) の新しいランタイム ローダーです。Zen Loader は、ステージング フェーズにオフラインで計算した最適化パッケージおよびオブジェクト依存関係グラフを使用することで、CPU オーバーヘッドを減らします。Zen Loader は、ステージング フェーズにオフラインで計算した最適化パッケージおよびオブジェクト依存関係グラフを使用することで、CPU オーバーヘッドを減らします。
.pak
ファイルは、頻繁にはアクセスされないルーズ ファイルに使用します。Pak ファイルがマウントされるとき、対応するコンテナ ファイルもマウントされます。.utoc
ファイルには、チャンク サイズとオフセット、圧縮形式、チャンクが暗号化されているかどうかの情報を含め、コンテナ ファイルについて記述します。.uca
ファイルに実際のデータが含まれます。コンテナ ファイルを使用すると、ファイル システムの抽象化がなくなり、I/O Dispatcher という新しい I/O 抽象化レイヤーを使用して、CPU のオーバーヘッドを最小限に抑えて、データ チャンクを見つけられるローダーを利用できます。プラットフォーム固有のバックエンドを使用し、ハードウェア機能と API からメリットを引き出します。
Zen Loader を使用する
Unreal Automation Tool(UAT) でステージ処理中に、デフォルトで、コンテナ ファイルを生成します。これらのコンテナ ファイルがあると、実行時に Zen Loader をアクティブ化します。
プロジェクトでコマンドを実行する方法の詳細については、「Unreal Automation の概要」を参照してください。
Event Driven Loader (EDL) のランタイム ローダーは、非推奨で、将来のリリースから除外されます。ただし、まだ次のコマンドを使用して、ステージ処理中に、UAT とともに使用することができます。
-SkipIoStore
他の方法として、C:\MyProject\Config\DefaultGame.ini
ファイルを開き、[ProjectPackagingSettings] セクションに次の行を追加します。
[/Script/UnrealEd.ProjectPackagingSettings]
bUseIoStore=False
bUseIoStore
ブーリアンに False
値を設定すると、Zen Loader に IOStore を使用しないように指示します。
制限事項
I/O Dispatcher は新しい I/O 抽象化レイヤーで、チャンク ID で示されるデータをロードします。つまり、I/O API でベースになっている標準ファイル/ディレクトリ形式で、データは検索やロードできません。アセット レジストリ は、各ディレクトリでアセットを検索する機能と同等のものをサポートします。 Zen Loader を使用すると、初期のシリアル化が完了した後、インライン データをロードすることが、バルクデータに対してできなくなります。つまりデータのロードが解除されると、再び取得することができません。頻繁にアクセスすることが必要なデータ セットは、クッキング フェーズにインラインではないデータとして格納する必要があります。 Zen Loader はステージ段階で、オブジェクトの依存関係のプリプロセスをオフラインで実行します。これにより、ランタイム時に必須パッケージのリダイレクトが避けられます。コア リダイレクトやデリゲート リゾルバなどのシステムはロード中に無視されます。
コンテナ ファイルの内容を検証する
次の表では、コンテナ ファイルと互換性がある、UnrealPak でサポートされたコマンドを示します。
コマンド | 説明 | |
---|---|---|
-list | コンテナ内のチャンクをリスト表示します。 | |
-diff | 2 つのコンテナの内容を比較します。 | |
-extract | コンテナの内容を取得します。 | |
IoStore -describe | コンテナの依存関係、パッケージ、インポートおよびエクスポートに関する詳細情報を示します。describe コマンドは
|
トラブルシューティング
以下に示すのは便利なトラブルシューティング コマンドで、各ステージでエラーや警告を特定するのに利用できます。
ロード
ロード段階で、Zen Loader は LogStreaming ログ チャンネルを使用します。Verbose/VeryVerbose ログ出力は、次のコマンドを使用してコマンド ラインで一時的に有効にできます。
-LogCmds="LogStreaming veryverbose"
大規模プロジェクトでは、ログ出力は大幅に時間がかかることがあります。特定のパッケージでのログをフィルタで選別できます。次のコマンドのとおり選択パッケージ名やパッケージ ID を設定します。
-s.VerbosePackageNames="/Game/PackageA/Game/PackageB0xABCD1234ABCD1234"
デバッガをアタッチして実行する場合、次のコマンドを使用します。
-s.DebugPackageNames
指定パッケージの特定のロード フェーズでブレイクポイントを自動で設定できます。
ステージング
ステージング フェーズで、UAT は次のコマンドを使用して、各コンテナに格納されたすべてのパッケージを、指定する (複数の) 応答ファイルのコマンド リストを生成します。
-ScriptsForProject= "C:\MyProject\MyProject.uproject"
このコマンドと、次のディレクトリ パスにある UAT ログ ファイルに別のものを見つけられます。
c:Engine\Programs\AutomationTool\Saved\Logs\Log.txt
Zen Loader の内部
Zen Loader は Event Driven Loader(EDL) をベースにしていて、名前テーブル、インポート / エクスポート マップ、プリロード依存関係など、クッカーと同じ出力タイプが必要になります。レガシー EDL ランタイム ロジックはオフラインになり、ステージング フェーズで生成されます。
プリプロセスをオフラインで実行する最適化により、ランタイム パッケージの依存関係の追跡にかかる時間が秒単位からミリ秒単位に削減されます。
さらに次の変更があります。
-
パッケージのサマリ、BLOB、バルクデータおよびシェーダーのエクスポートはコンテナ ファイルに配置されます。
-
最も重要なパッケージのメタデータとすべてのパッケージの依存関係は、パッケージ ID のインデックスが付いたパッケージ ストアに集められます。
-
.uasset パッケージ ヘッダは、最適化パッケージ サマリに変換されます。
-
他のチェーンがあるインポート マップは除外され、エクスポート オブジェクト ハッシュにより直接参照と置き換えられます。
-
名前テーブルには新しい最適化バッチ形式があります。
-
プリロード依存関係はパッケージごとのエクスポート バンドル ノードに平坦化されます。それぞれでは、
CreateExport
およびSerializeExport
コールのシーケンスと他のエクスポート バンドル ノードへの依存関係を指定します。
-
Zen ストア
Zen ストアは実験段階の機能で、クック済みのアセットを、ローカル ストレージ サーバーのルーズ ファイルではなくローカル ファイルシステムに格納できます。詳細は「Zen ストア」を参照してください。