【UE4.25 新機能】ロードの高速化機能「IOStore」について【2020】

15.1K Views

November 06, 20

スライド概要

講演動画はこちら https://youtu.be/i31wSiqt-7w

UE4.25から実装された新しいロードシステムの一部である IOStore について解説いたします。

Software Engineer Developer Relations, 鍬農 健二郎 ( https://twitter.com/donbutsu17 )

profile-image

Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

IOStore Epic Games Japan Software Engineer, Developer Relations Ken Kuwano

2.

はじめに ● IOStoreはまだ実験的な機能のため、構成や詳細な内容は今後 変わる可能性があります ● 内容は UE4.25.4 をベースとした内容となります #UE4 | @UNREALENGINE

3.

目次 ● IOStoreの概要 ● IOStoreとNewLoader ● ロードと負荷対策 #UE4 | @UNREALENGINE

4.

IOStoreとは ● UE4.25から実装された新しいロードシステムの一部 ● IOの情報をストア(保管)する機能 ● IOのパフォーマンスを改善してロードを高速化 ● IOStoreの機能を有効にしたパッケージアプリで有効 #UE4 | @UNREALENGINE

5.

ロードシステムのロードマップ UE4.25 UE4.26 Experimental Beta Editor動作 Not IoStoreビルド AsyncLoader 従来のローダー IoStoreビルド AsyncLoader2 新しいローダー #UE4 | @UNREALENGINE

6.

AsyncLoader2とは? フォーラム:Unreal Engine 4.26 Previewより抜粋 #UE4 | @UNREALENGINE

7.

IOStoreの作用 パッケージ作成フロー (IOStore=OFF) Build Cook .uasset Stage Package .uasset .pak .uasset .uasset 暗号化や圧縮のために 1つのファイルにまとめる #UE4 | @UNREALENGINE Archive

8.

IOStoreの作用 パッケージ作成フロー (IOStore=ON) Build Cook .uasset Stage .uasset Package .pak Archive .utoc .ucas .uasset .uasset アセット +高速化用のファイル #UE4 | @UNREALENGINE

9.

IOStoreの適用 IOStoreを有効にしたアプリケーションパッケージを作成 [手順] 1. IOStoreを有効にする 2. パッケージを作成する #UE4 | @UNREALENGINE

10.

IOStoreの有効化 以下のいずれかの方法でIOStoreを有効にしたパッケージを作成できる ● Project設定でUsePakFile, UseIoStoreを有効にする ● Project LauncherではUnrealPakとI/OStoreを有効にする ● UATの”BuildCookRun”実行時は”-iostore”, “-pak”の両方を指定 #UE4 | @UNREALENGINE

11.

パッケージ作成後のアセット配置の違い IoStore=OFF IoStore=ON #UE4 | @UNREALENGINE

12.

IOStore有効時のファイル構成 .pakファイル以外に.ucas, .utocファイルが追加 .pak : パックファイル .ucas : コンテナファイル .utoc : 目次ファイル #UE4 | @UNREALENGINE

13.

.pak:パックファイル ● IOStore=OFF時は 全てのアセットファイル を格納 ● IOStore=ON時は アクセス頻度が低いファイル を格納 ● ● #UE4 | @UNREALENGINE .ini, .ushaderbytecode, .uproject などが保存される 今まで保存されていたアセットファイルは.ucasに移行

14.

.ucas:コンテナファイル アセットファイル (.uasset, .umap, .ubulk, .uptnl, uexp)を格納 ● ● 16Byteアライメントオーダーによるパフォーマンス向上 アセットデータの効率的な配置によるファイルアクセスの高速化 0 15 アセット1 00 00 アセット2 アセット情報 (FIoBuffer) アセット2 00 00 00 00 アセット3 アセット3 #UE4 | @UNREALENGINE 00 00 00 00 00 00

15.

.utoc:目次ファイル 目次(TOC:Table Of Contents)情報を格納 ● .ucasとパッケージを紐づけるため目次情報 ヘッダー情報 Magic Header Size Entry Count Entry Size Padding (FIoStoreTocHeader) ChunkId アセット別情報 (FIoStoreTocEntry) #UE4 | @UNREALENGINE OffsetAndLength 1001 0 320 1002 320 160 1003 480 32000

16.

IOStore有効時のファイル構成 プロジェクトとは別にグローバル.ucas/.utocファイルが追加 #UE4 | @UNREALENGINE

17.

global.ucas:グローバルコンテナファイル コンテナからパッケージをロードするために必要な情報が格納 IoChunkType 内容 LoaderGlobalMeta グローバルメタ情報テーブル パッケージのロードに関するストア情報 LoaderInitialLoadMeta 初回ロードメタ情報テーブル パッケージとバンドルを紐づける情報 LoaderGlobalNames グローバルネームテーブル ロード時にバンドルとオブジェクト名を紐づけるネームテーブル LoaderGlobalNameHashes グローバルネームハッシュ ロード時にバンドルとオブジェクト名を紐づけるハッシュテーブル #UE4 | @UNREALENGINE

18.

global.utoc:グローバル目次ファイル こちらは空のヘッダー情報のみで未使用 #UE4 | @UNREALENGINE

19.

IOStoreの効果検証 条件 ● サンプルでスタートアップレベルのロード時間を計測 ● Win64/Testビルドのパッケージ, Unreal Insightsを使用 ※KiteDemoはWorldComposition無効で計測 #UE4 | @UNREALENGINE

20.

サンプルでの検証結果 5%↓ 28%↓ 28%↓ IOStoreの有効化はロード時間を改善 #UE4 | @UNREALENGINE

21.

目次 ● IOStoreの概要 ● IOStoreとNewLoader ● ロードと負荷対策 #UE4 | @UNREALENGINE

22.

アセットロード時の非同期ロードってこんなイメージだっけ? 「非同期ロードはGameに影響しない」ではない。 (正しくは次ページ以降で) Game Other Work Request Async Loading Load Read アセット #UE4 | @UNREALENGINE Data

23.

AsyncLoaderによるロードの概念図 GameThread ゲームのメイン処理 AsyncLoading Thread Work/Wait Load Request Load Work/Wait バックグラウンドのロードを制御 PoolThread ファイルの読み込み制御 Read Seek/Read Data .pak #UE4 | @UNREALENGINE Complete Complete

24.

AsyncLoaderによるロードとファイルアクセス LoadPackage スレッド QueuePackage AsyncLoading Thread GameThread Event Queue AsyncPackage CreateLinker AsyncPackage AsyncPackage Start PoolThread Seek/Read #UE4 | @UNREALENGINE AsyncPackage AsyncArchive

25.

AsyncLoaderによるロードとファイルアクセス ① LoadPackage スレッド ② QueuePackage AsyncLoading Thread GameThread Event Queue AsyncPackage ③ CreateLinker AsyncPackage AsyncPackage ④ Start PoolThread ⑤ Seek/Read #UE4 | @UNREALENGINE AsyncPackage AsyncArchive

26.

AsyncLoader ● Async Loading Thread ● Game Threadのバックグラウンドでアセットをロード ● Pool Thread ● FileIOのAPIを実行して.pakファイルからアセットを読み込み #UE4 | @UNREALENGINE

27.

AsyncLoader2によるロードの概念図 Game Thread ゲームのメイン処理 Async Loading Thread2 Work/Wait Load Request Load Work/Wait バックグラウンドのロードを制御 IoService ファイルの読み込み制御 Read Seek/Read Data .ucas #UE4 | @UNREALENGINE Complete Complete

28.

AsyncLoader2によるロードとファイルアクセス LoadPackage スレッド QueuePackage AsyncLoading Thread2 GameThread Event Queue AsyncPackage2 ReadWithCallback AsyncPackage2 ReadFrom BlockFile IoService #UE4 | @UNREALENGINE AsyncPackage2 IoDispatcher Seek/Read AsyncPackage2

29.

AsyncLoader2によるロードとファイルアクセス スレッド ① LoadPackage ② QueuePackage AsyncLoading Thread2 GameThread Event Queue AsyncPackage2 ③ ReadWithCallback AsyncPackage2 ④ ReadFrom BlockFile IoService ⑤ Seek/Read #UE4 | @UNREALENGINE AsyncPackage2 AsyncPackage2 IoDispatcher

30.

AsyncLoader2 ● Async Loading Thread2 ● ● ● 新しい非同期ロード用スレッド IOStoreを利用するための変更 CPUオーバーヘッドを減らし効率的な方法でIOをリクエスト ● IoDispatcher ● Async Loading ThreadとIoServiceを中継 ● IoService ● FileIOのAPIを実行して.ucasファイルからアセットを読み込み #UE4 | @UNREALENGINE

31.

目次 ● IOStoreの概要 ● IOStoreとNewLoader ● ロードと負荷対策 #UE4 | @UNREALENGINE

32.

https://www.slideshare.net/EpicGamesJapan/ue4loadinggcprofiling このスライドを見れば分かりますが、 #UE4 | @UNREALENGINE

33.

Unreal Insightsでロードの解析と改善策の検討もできます #UE4 | @UNREALENGINE

34.

スレッドの処理やアセット毎の処理時間を視覚化 (Asset Loading Insights) #UE4 | @UNREALENGINE

35.

#UE4 | @UNREALENGINE

36.

AsyncLoader2によるロードとファイルアクセス LoadPackage スレッド QueuePackage AsyncLoading Thread2 GameThread Event Queue AsyncPackage2 ReadWithCallback AsyncPackage2 ReadFrom BlockFile IoService Seek/Read #UE4 | @UNREALENGINE AsyncPackage2 AsyncPackage2 IoDispatcher

37.

有効にする #UE4 | @UNREALENGINE

38.

プロファイルをキャプチャ 以下の起動引数を追加してアプリケーションを起動 -trace=cpu,file,loadtime -statnamedevents -AsyncLoadingThread #UE4 | @UNREALENGINE

39.

ロードの検証ポイント どこで処理に時間が掛かっているか (バーが長い?) ● ● ● IO Async Loading Thread Game Thread #UE4 | @UNREALENGINE

40.

アセットロード時のタイムライン (フロー) #UE4 | @UNREALENGINE

41.

AsyncLoader2によるロードとファイルアクセス LoadPackage スレッド QueuePackage AsyncLoading Thread2 GameThread Event Queue AsyncPackage2 ReadWithCallback AsyncPackage2 ReadFrom BlockFile IoService Seek/Read #UE4 | @UNREALENGINE AsyncPackage2 AsyncPackage2 IoDispatcher

42.

アセットロード時のタイムライン (フロー) #UE4 | @UNREALENGINE

43.

アセットロード時のタイムライン (フロー) ① ⑥ ② ③ ⑤ ④ #UE4 | @UNREALENGINE

44.

アセットロード時のタイムライン (ポイント) Game AsyncLoading IO #UE4 | @UNREALENGINE

45.

アセットロード時のタイムライン (IO) IO #UE4 | @UNREALENGINE

46.

負荷要因と対策 (IO) 負荷 ● ファイルの読み込み時のシークとリード 対策 ● ● アセットのデータサイズ削減 アセットの読み込みタイミング変更 (常駐化、先読み、後読み) #UE4 | @UNREALENGINE

47.

アセットロード時のタイムライン (AsyncLoading) AsyncLoading #UE4 | @UNREALENGINE

48.

負荷要因と対策 (AsyncLoading) 負荷 ● ● ● パッケージのリファレンス ネイティブクラスのコンストラクタ シリアライズ処理(テクスチャ, マテリアル, スタティックメッシュなど...) 対策 ● ● ● ● ● リファレンス(ハード/ソフト)の管理 コンストラクタ処理の最適化 テクスチャ(Shadowmap, Cubemap, Lightmap)の解像度、Mip設定の見直し シェーダーが参照するリソース数の削減 スタティックメッシュのLOD設定の削減 #UE4 | @UNREALENGINE

49.

アセットロード時のタイムライン (Game) #UE4 | @UNREALENGINE Game

50.

負荷要因と対策 (Game) 負荷 ● ● ● ● レベルストリーミング アクター、コンポーネントの追加 アニメーション処理、物理ボディのセットアップ処理 マテリアルのポストロード処理 対策 ● ● ● ● レベルストリーミングのタイミング調整 余剰なアクター、コンポーネントの整理 アニメーションの制御、Collision設定, 物理ボディ数の調整 不要なマテリアルのロードチェック #UE4 | @UNREALENGINE

51.

ロードの検証ポイント どこで処理に時間が掛かっているか (バーが長い?) ● ● ● IO Async Loading Thread Game Thread #UE4 | @UNREALENGINE

52.

まとめ ● IOStoreを利用することでロード時間の短縮 ● 4.25ではExperimental, 4.26ではBetaとして利用可能 ● IOのパフォーマンスとCPUのオーバーヘッドを抑制 ● ロード時間は積極的に改善 ● Unreal Insightsは解析の役に立ちます ● 実装の時点から注意しておきましょう #UE4 | @UNREALENGINE

53.

#UE4 | @UNREALENGINE