検証バージョン:UE4.27
概要
コンソールコマンドからのアセットロードする方法について記載します。このコマンドはShipping以外のビルドで利用することができ、さまざまなケースに応用することができます。
・アセット単独でのロードの負荷を調べることができる
アセットを指定してロードすることができます。これは「空のレベルで指定のアセットのみをロードする」といったことを行うことによって、1つのアセットがロードされる際の純粋なロードの負荷を調べる際に役に立ちます。レベルのロード時や初期化時には大量のアセットがロードされがちですがこのコマンドを利用して単独でアセットをロードすることによって、本当に原因となっているアセットや処理を特定することができます。
・特定のアセットにリファレンスされたアセットを調べることができる
Unreal Insightsでアセットロード状況を確認することによって、どのようなアセットが紐づいていてロードされているかを調べる事ができます。
・アセットがパッケージに存在していることを調べることができる
アセットを指定したロードができるため、現在のパッケージ内にアセットが含まれているかどうかを調べるのにも役に立ちます。特にDLCやパッチにおいて、アセットはチャンク毎に分割してインストールされることになるので、現在マウントされたパックにアセットが存在しているかを調べることができます。
使用方法
コンソールコマンド LoadPackageAsync
を使用することで、指定したアセットをロードすることができます。**引数としてアセットのパッケージパス
**を渡します。
LoadPackageAsync /Game/Mannequin/Character/Textures/T_UE4Logo_Mask
複数のパッケージパスを指定する事で複数のアセットをロードします。以下の例ではWorld1, World2のマップがバックグラウンドでロードされます。
LoadPackageAsync /Game/Maps/World1 /Game/Maps/World2
ロードの負荷を見たい場合は、Unreal InsightsでAssetLoadingInsightsを有効にしてこのコマンドを実行するだけです。特定のアセットのみがロードされてプロファイルにも出力されます。例えば以下のように、レベルにリファレンスされたウィジェットがあるような条件において、レベル(World2)だけをロードすると、
以下のような出力が得られます。レベルだけを指定してロードした時に、LoadingトラックではリファレンスされたWB_Testのウィジェットも含む2つのアセット(水色と緑色のバーのアセット)がロードされていることが分かります。
コード部
以下はこのコンソールコマンドを実行する部分のコードになります。Shipping以外では動作しないようになっていますが、ロジック自体はShippingでも利用できるので、LoadPackageAsync()の処理をプロジェクト側で再利用しても問題はありません。
static void LoadPackageAsyncCommand(const TArray<FString>& Args)
{
for (const FString& PackageName : Args)
{
UE_LOG(LogStreaming, Display, TEXT("LoadPackageAsyncCommand: %s - Requested"), *PackageName);
LoadPackageAsync(PackageName, FLoadPackageAsyncDelegate::CreateLambda(
[](const FName& PackageName, UPackage* Package, EAsyncLoadingResult::Type Result)
{
UE_LOG(LogStreaming, Display, TEXT("LoadPackageAsyncCommand: %s - %s"),
*PackageName.ToString(), (Package != nullptr) ? TEXT("Loaded") : TEXT("Failed"));
}
));
}
}
static FAutoConsoleCommand CVar_LoadPackageAsyncCommand(
TEXT("LoadPackageAsync"),
TEXT("Loads packages async by names. Usage: LoadPackageAsync <package name> [<package name> ...]"),
FConsoleCommandWithArgsDelegate::CreateStatic(LoadPackageAsyncCommand));
また、このコマンドと同じような"LoadPackage"というコマンドもありますが、こちらはGameThreadでの非同期実行待ち処理が走りスパイクが発生することがあります。ですので、LoadPackage"よりは"LoadPackageAsync"をご利用ください。