この記事は裏 Unreal Engine 4 (UE4) Advent Calendar 2016の19日目の記事です。
UE4ではBlueprintやMaterialEditorなどを利用することで素早くイテレーションを回すことができますが、
PIE(Play In Editor)時の起動時間やPersistentLevel間を移動する際のロード時間が長い点に関して、
もう少し改善できないかなと考えていました。
4.14で「高速同期ロードシステムEDL(EventDrivenLoder)」というロードの高速化が期待できる機能が追加されたので、EDLを含めたロード周りの設定に関して幾つか検証してみました。
#設定内容
ロードに関連の設定はエディタのProjectSetting->Streamingから設定できます。
改めてソース見てて気づいたのですが、ここで「PackageStreaming」と書かれている項目はパッケージでの動作時にしか影響を及ぼしません。なので、4.14で追加されたEDLもパッケージでの動作時のみ有効となります(残念...)。
# | 項目 | 説明 |
---|---|---|
1 | AsyncLoadingThreadEnabled | 非同期ロード用のスレッドの有無設定 |
2 | EventDrivenLoaderEnabled | 高速同期ロードシステムEDL(EventDrivenLoder)の有効/無効設定 |
3 | WarnIfTimeLimitExceeded | タイムアウト時の警告通知の有無設定 |
4 | TimeLimitExceededMultiplier | タイムアウト時の閾値 |
5 | TimeLimitExceededMinTime | タイムアウト時の警告通知の最短時間 |
6 | MinBulkDataSizeForAsyncLoading | 非同期ロードの最小データ容量 |
7 | AsyncIOBandwidthLimit | 非同期ロード帯域制限(MByte/s) |
8 | UseBackgroundLevelStreaming | レベル非同期ロードの許可設定 |
9 | AsyncLoadingUseFullTimeLimit | 非同期ロード時の読み込み制限時間の有無設定 |
10 | AsyncLoadingTimeLimit | 非同期ロード時の読み込み制限時間(s) |
11 | PriorityAsyncLoadingExtraTime | HighLevelPriority(WorldSettings)がある場合の非同期ロード延長時間 |
12 | LevelStreamingActorsUpdateTimeLimit | レベルストリーミング中の1Actorの最大登録時間(ms/f) |
13 | LevelStreamingComponentsRegistrationGranularity | レベルストリーミング中にActorComponentを登録するために使用されるバッチ処理の粒度 |
#検証
##方法
SeemlessTravel機能を利用して、中間レベルで遷移先のアセット/レベルをロードします。開始時のレベル(StatMap)と中間のレベル(Maps)はデフォルトシーンを使用、遷移先のレベル(Elemental)は学習用コンテンツから入手できるものを使用し、DevelopmentでパッケージしたBuildの動作を確認します。SeemlessTravel機能はドキュメントにも記載されていますが、予めGameModeと中間レベルの設定が必要で、Standalone時の動作が前提となります。詳しくはリンク先をご覧下さい。
-検証手順
・以下の構成を用意し、0キーを押してレベル遷移させています。
やりたいこととしてはStartMapからElementalへ遷移することで、SeemlessTravel機能によりElementalをオープンする前に中間レベル(Map2)で遷移先の読み込みを行います。ロード完了後、Map2→Elementalに自動で遷移します。
###(1) デフォルト設定
デフォルト設定の状態からレベル遷移を5回実行します。
他の設定と比較する用の基準値としています。
<結果>
遷移完了してレベルロード完了まで平均時間:2.9sec
###(2) 非同期ロードスレッドを使用
項目1を有効化(AsyncLoadingThreadEnabled = true;)します。
この設定が無効の状態だとメインスレッドで非同期ロードも処理するのですが、有効にすることで非同期ロード専用にスレッドを立てて非同期ロード処理を行います。
<結果>
(1)よりも短時間でロード完了していることが分かります。
遷移完了してレベルロード完了まで平均時間:1.9sec
###(3) EDLを使用する
項目2を有効化(EventDrivenLoaderEnabled= true;)します。
が、4.14ではEditorからの設定内容が反映されない問題があるため、直接コードを書き換えます。
AsyncLoading.cpp の145行目付近に設定項目があるので、
検証する際はGitHubからソースを落として以下の修正を行ってください。
※変更後はプロジェクトのRebuildが必要
//static int32 GEventDrivenLoaderEnabled = 0;
static int32 GEventDrivenLoaderEnabled = 1;
<結果>
目に見えて早くなったというわけではないですが、(2)よりも平均して良い数値が得られました。
遷移完了してレベルロード完了まで平均時間:1.7sec
#さいごに
バージョンアップと共に色々な便利機能が追加されていますが、併せて様々な設定項目も追加されています。
バージョンアップ時にはエディタの設定項目の変化や、コンフィグの差分など、一度見直してみると良いかもしれませんね。
明日は@sinobuさんの「キャラクターについて何か書かせてもらいます。」です。