LoginSignup
1

More than 1 year has passed since last update.

[UE4] コンソールコマンドから指定したアセットのロード (LoadPackageAsync)

Last updated at Posted at 2021-09-09

検証バージョン:UE4.27

概要

 コンソールコマンドからのアセットロードする方法について記載します。このコマンドはShipping以外のビルドで利用することができ、さまざまなケースに応用することができます。

・アセット単独でのロードの負荷を調べることができる
 アセットを指定してロードすることができます。これは「空のレベルで指定のアセットのみをロードする」といったことを行うことによって、1つのアセットがロードされる際の純粋なロードの負荷を調べる際に役に立ちます。レベルのロード時や初期化時には大量のアセットがロードされがちですがこのコマンドを利用して単独でアセットをロードすることによって、本当に原因となっているアセットや処理を特定することができます。

・特定のアセットにリファレンスされたアセットを調べることができる
 Unreal Insightsでアセットロード状況を確認することによって、どのようなアセットが紐づいていてロードされているかを調べる事ができます。

・アセットがパッケージに存在していることを調べることができる
 アセットを指定したロードができるため、現在のパッケージ内にアセットが含まれているかどうかを調べるのにも役に立ちます。特にDLCやパッチにおいて、アセットはチャンク毎に分割してインストールされることになるので、現在マウントされたパックにアセットが存在しているかを調べることができます。

使用方法

 コンソールコマンド LoadPackageAsync を使用することで、指定したアセットをロードすることができます。引数としてアセットのパッケージパスを渡します。

コマンド例1:1つのテクスチャをロード
LoadPackageAsync /Game/Mannequin/Character/Textures/T_UE4Logo_Mask

 複数のパッケージパスを指定する事で複数のアセットをロードします。以下の例ではWorld1, World2のマップがバックグラウンドでロードされます。

コマンド例2:2つのレベルをロード
LoadPackageAsync /Game/Maps/World1 /Game/Maps/World2

 ロードの負荷を見たい場合は、Unreal InsightsでAssetLoadingInsightsを有効にしてこのコマンドを実行するだけです。特定のアセットのみがロードされてプロファイルにも出力されます。例えば以下のように、レベルにリファレンスされたウィジェットがあるような条件において、レベル(World2)だけをロードすると、

2021-09-05_14h25_34.png

以下のような出力が得られます。レベルだけを指定してロードした時に、LoadingトラックではリファレンスされたWB_Testのウィジェットも含む2つのアセット(水色と緑色のバーのアセット)がロードされていることが分かります。

2021-09-05_14h30_36.png

コード部

 以下はこのコンソールコマンドを実行する部分のコードになります。Shipping以外では動作しないようになっていますが、ロジック自体はShippingでも利用できるので、LoadPackageAsync()の処理をプロジェクト側で再利用しても問題はありません。

AsyncPackageLoader.cpp
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"をご利用ください。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1