[UE4] ログからアセットの展開状況を調べる

#1. 概要
　本記事はアセットロードについて調べていた際に書いたものですが、この記事を読むと以下の内容を知ることができます。

　**・アセットがロードされたかどうかを知りたい**
　**・IOStoreが有効なビルドかどうかを知りたい**
　**・.pakファイル展開時にどのファイルのマウントに時間がかかっているかを知りたい**
　**・Unreal Insightsが接続できないけどアセットのロード状況を把握したい**

アセットのロードがどのような状況でどのように行われているかは、Project SettingsやUnrealInsightsでプロファイル結果を見ることでより情報を得ることができます。しかし、それらの情報が常に得られるとは限らないので、今回はログからそれらの状況を取得して把握・判断するための方法を記載します。

#2. 設定
　今回はログからアセットの展開状況を知るのでLogのVerbosityを変更します。変更するカテゴリとVerbosityは以下の通りです。パッケージに予め含めたい場合は以下のように追加しますが、ログ出力の量がそこそこ多いので、調べたい場合にのみ限定して有効にすることをおすすめします。

```:DefaultEngine.ini
[Core.Log]
LogIoDispatcher=Verbose
LogPakFile=Verbose
LogStreaming=VeryVerbose
```

上記だとログが常時有効なため、必要な場合だけ適用したい場合はLogコマンドを使用して変更してください。

```:例
Log LogIoDispatcher Verbose
```
.pakファイルなど起動直後から展開されるファイルのトラッキングを行いたいケースでは、起動引数としてLogのVerbosityを指定することも可能です。Standaloneでチェックする場合はアセットのシングルパックファイルを使用しないので、アセットのロード状況のみを確認する場合には以下のように[Additional Launch Parameters]に指定できます。

```:例
-log -ini:Engine:[Core.Log]:LogStreaming=VeryVerbose
```
.pakのマウント状況などを見たいケースなどパッケージの起動時に指定したい場合は、複数のLogカテゴリも以下のように指定できます。

```:例
-log -ini:Engine:[Core.Log]:LogIoDispatcher=Verbose,[Core.Log]:LogPakFile=Verbose,[Core.Log]:LogStreaming=VeryVerbose
```

#3. 詳細
 状況を把握するログのリストと示す内容について以下に記載します。
##1) LogIoDispatcher
　IoDispatcherはIOStoreに関連するログを出力します。

　以下はIOStoreが有効な場合、アプリケーション起動直後に表示されるべきログです。アセットをロード開始するためにまず最初にコンテナのマウントを行います。これが表示されない場合はIOStoreが無効になっている可能性があります。

```
LogIoDispatcher: Display: Reading toc: ../../../ShooterGame/Content/Paks/pakchunk2-WindowsNoEditor.utoc
LogIoDispatcher: Display: Mounting container 'pakchunk2-WindowsNoEditor' in location slot 0
```

##2) LogPakFile
　Pakファイルに関連するログを出力します。

　以下はアプリケーション起動直後に表示されるべきログで、アセットをロードする前に.pakのマウントを行います。

```
LogPakFile: Display: Found Pak file ../../../ShooterGame/Content/Paks/pakchunk2-WindowsNoEditor.pak attempting to mount.
LogPakFile: Display: Mounting pak file ../../../ShooterGame/Content/Paks/pakchunk2-WindowsNoEditor.pak.
```

　Pakファイルからアセットをロードするステートを示します。"StartBlockTask"から"Notify complete"までで1つのブロックとしてロードしていることを示します。IOStoreを有効にしている場合は殆どのアセットがコンテナファイルに保存されるようになるので、Pakファイルに格納されるアセットは非常に限定的になります(シェーダーバイトコードや.iniなど)。この処理後に長い待ちがある場合はファイルのIOがボトルネックとなっている可能性があります。

```
LogPakFile: Verbose: FPakPlatformFile::OpenAsyncRead[0000000004231835, 000000000474C5D1)
LogPakFile: Verbose: FPakReadRequest[0000000004240000, 0000000004260000) StartBlockTask
LogPakFile: Verbose: FPakReadRequest[0000000004241835, 0000000004251835) QueueRequest COLD
LogPakFile: Verbose: FPakReadRequest[0000000004241835, 0000000004251835) Notify complete
LogPakFile: Verbose: FPakReadRequest[0000000004450000, 0000000004460000) Discard Cached
LogPakFile: Verbose: FPakReadRequest[0000000004450000, 0000000004460000) ClearBlock
```


##3) LogStreaming

　アセットの読み込み状況に関連するログになります。
　主にAsyncLoadingThreadでのアセットのロード（非同期ロード）の進捗状況を示しています。この処理で長い待ちがある場合はファイルのロード時のAsyncLoadingでの処理がボトルネックとなっている可能性があります。適切なタイミングでロード出来ているか、多くのファイルや巨大なファイルのロードが集中していないかなどを確認し、ロードが適切なものか確認することができます。

```
LogStreaming: Verbose: LoadPackage: QueuePackage: /Engine/EngineResources/WhiteSquareTexture (0x20DDF459FDE55EB8) - Package added to pending queue.
LogStreaming: Verbose: CreateAsyncPackages: AddPackage: /Engine/EngineResources/WhiteSquareTexture (0x20DDF459FDE55EB8) - Start loading package.
LogStreaming: Verbose: ImportPackages: AddPackage: None (0xA472DFE5D5BD43B7) - Start loading imported package.
LogStreaming: VeryVerbose: CreateUPackage: AddPackage: /Engine/EngineResources/WhiteSquareTexture (0x20DDF459FDE55EB8) - New UPackage created.
LogStreaming: VeryVerbose: CreateExport: /Engine/EngineResources/WhiteSquareTexture (0x20DDF459FDE55EB8) - Created public export /Engine/EngineResources/WhiteSquareTexture.WhiteSquareTexture. Tracked as 0x1E3CE96AA65032AD
LogStreaming: VeryVerbose: SerializeExport: /Engine/EngineResources/WhiteSquareTexture (0x20DDF459FDE55EB8) - Serialized export /Engine/EngineResources/WhiteSquareTexture.WhiteSquareTexture
LogStreaming: Verbose: AsyncThread: FullyLoaded: /Engine/EngineResources/WhiteSquareTexture (0x20DDF459FDE55EB8) - Async loading of package is done, and UPackage is marked as fully loaded.
LogStreaming: Verbose: GameThread: LoadCompleted: /Engine/EngineResources/WhiteSquareTexture (0x20DDF459FDE55EB8) - All loading of package is done, and the async package and load request will be deleted.
LogStreaming: Verbose: AsyncThread: Deleted: /Engine/EngineResources/WhiteSquareTexture (0x20DDF459FDE55EB8) - Package deleted.
```

![2021-07-07_18h43_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364110/0142c417-7122-a68a-57fb-36bc93cfc5bc.png)