63.2K Views
November 15, 20
スライド概要
講演動画はこちら:https://youtu.be/V5tUNlfiJ5s
UE4.25でクック済みゲームのアセットシリアライゼーションに
改善された処理方法を選択できるようになりました。
本プレゼンテーションでは「シリアライゼーション」について解説した後
新しいシリアライゼーションの有効化方法、
どのような部分が改善されたのかを説明いたします。
Software Engineer Developer Relations, 鈴木 孝司 ( https://twitter.com/wankotank )
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
Unversioned Property Serialization Epic Games Japan Software Engineer - Developer Relations Takashi Suzuki
はじめに #UE4 | @UNREALENGINE
はじめに #UE4 | @UNREALENGINE
はじめに #UE4 | @UNREALENGINE
はじめに #UE4 | @UNREALENGINE
はじめに UE4.25でクック済みゲームのアセットシリアライゼーションに 改善された処理方法を選択できるようになりました。 本プレゼンテーションでは「シリアライゼーション」について解説した後 新しいシリアライゼーションの有効化方法、 どのような部分が改善されたのかを説明いたします。 #UE4 | @UNREALENGINE
https://docs.unrealengine.com/ja/Support/Builds/ReleaseNotes/4_25/index.html #UE4 | @UNREALENGINE
目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE
目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE
シリアライズとは RuntimeObject UPROPERTY付き 変数 c++変数 #UE4 | @UNREALENGINE
シリアライズとは ABananaCharacter #UE4 | @UNREALENGINE
シリアライズとは ABananaCharacter #UE4 | @UNREALENGINE
シリアライズとは ABananaCharacter プロパティ c++変数 #UE4 | @UNREALENGINE
シリアライズとは ABananaCharacter UClass FProperty UPROPERTY付き 変数 FProperty FProperty FProperty UClassはオブジェクトの構造を表現するデータ構造です。 #UE4 | @UNREALENGINE
シリアライズとは シリアライズされた データのコンテナ ABananaCharacter UClass FProperty UPROPERTY付き 変数 FProperty FProperty FProperty #UE4 | @UNREALENGINE 直列化済みデータ
シリアライズとは シリアライズされた データのコンテナ ABananaCharacter UPROPERTY付き 変数 UClass FProperty FProperty FProperty FProperty c++変数 #UE4 | @UNREALENGINE Archive
シリアライズとは シリアライズされた データのコンテナ ABananaCharacter UPROPERTY付き 変数 UClass FProperty FProperty FProperty 直列化済みデータ FProperty c++変数 UE4におけるシリアライズはメモリ上のオブジェクトから UClassで表現されるプロパティを通してデータを収集し直列化する処理です。 #UE4 | @UNREALENGINE
シリアライズとは メモリ上のオブジェクトが持つパラメーターを クラスが持つプロパティ情報を参照しながら収集し 扱いやすいように直列化すること #UE4 | @UNREALENGINE
デシリアライズ ABananaCharacter UPROPERTY付き 変数 UClass FProperty FProperty FProperty FProperty c++変数 #UE4 | @UNREALENGINE 直列化済みデータ
デシリアライズ ABananaCharacter UPROPERTY付き 変数 UClass FProperty FProperty FProperty FProperty c++変数 #UE4 | @UNREALENGINE 直列化済みデータ
デシリアライズ ABananaCharacter UPROPERTY付き 変数 UClass FProperty FProperty FProperty FProperty c++変数 #UE4 | @UNREALENGINE 直列化済みデータ
シリアライズはどのような場面で 利用されているのでしょうか? #UE4 | @UNREALENGINE
シリアライズの用途 RuntimeObject #UE4 | @UNREALENGINE シリアライズ
シリアライズの用途 アセットの保存、読込 DuplicateObject RuntimeObject シリアライズ Undo ネットワークコードの送受信データ Cook済みアセットの保存・読込 などなど #UE4 | @UNREALENGINE
シリアライズの用途 アセットの保存、読込 DuplicateObject RuntimeObject シリアライズ Undo ネットワークコードの送受信データ Cook済みアセットの保存・読込 などなど #UE4 | @UNREALENGINE
目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE
二つのシリアライズ処理 #UE4 | @UNREALENGINE
二つのシリアライズ処理 4.24以前 エディタでアセットを保存したり読み込む TaggedPropertySerializer (TPS) Cook時にアセットを保存する Cook済みビルドでアセットを読み込む #UE4 | @UNREALENGINE
二つのシリアライズ処理 TaggedPropertySerializer (TPS) 4.25から エディタでアセットを保存したり読み込む Cook時にアセットを保存する UnversionedPropertySerializer (UPS) Cook済みビルドでアセットを読み込む #UE4 | @UNREALENGINE
TPSのシリアライズ UClass プロパティ #UE4 | @UNREALENGINE TaggedPropertySerializer アセットファイル uasset
TPSのシリアライズ UClass TaggedPropertySerializer FProperty プロパティ #UE4 | @UNREALENGINE アセットファイル uasset
TPSのシリアライズ UClass FProperty プロパティ #UE4 | @UNREALENGINE TaggedPropertySerializer FPropertyTag アセットファイル uasset
PropertyTag ● 型 ● ● #UE4 | @UNREALENGINE コンテナ型のサイズ 構造体の名前 ● ● 名前 GUID ● ● ● プロパティのリネーム追跡 型の変化への追従 float->int など プロパティリダイレクタ
TPSのシリアライズ UClass FProperty プロパティ TaggedPropertySerializer FPropertyTag アセットファイル uasset FPropertyTag 直列データ #UE4 | @UNREALENGINE
TPSのデシリアライズ UClass TaggedPropertySerializer FProperty プロパティ アセットファイル uasset FPropertyTag 直列データ #UE4 | @UNREALENGINE
TPSのデシリアライズ UClass FProperty TaggedPropertySerializer FPropertyTag アセットファイル uasset プロパティ 直列データ #UE4 | @UNREALENGINE
TPSのデシリアライズ TaggedPropertySerializer UClass FProperty プロパティ FPropertyTag アセットファイル uasset 検索! 直列データ #UE4 | @UNREALENGINE
TPSのデシリアライズ UClass FProperty TaggedPropertySerializer FPropertyTag アセットファイル uasset プロパティ 直列データ #UE4 | @UNREALENGINE
TPSのシリアライズ UClass FProperty TaggedPropertySerializer FPropertyTag アセットファイル uasset 変数 FPropertyTag #UE4 | @UNREALENGINE
TaggedPropertySerialization ● プロパティタグによってデータの互換性をサポート ● 変数毎にプロパティタグを付加 ● データをメモリに戻す際に検索を行う #UE4 | @UNREALENGINE
UnversionedPropertySerializationへ ● 昨今は差分パッチによる配布が利用可能 ● そのため実装が追加に伴い対応データも変更する ● 次世代機の高速ストレージ 高効率な UPSを提供 #UE4 | @UNREALENGINE
UPSのシリアライズ オブジェクト UClass 変数A FProperty 変数B FProperty 変数C FProperty #UE4 | @UNREALENGINE Unversioned PropertySerializer アセットファイル
UPSのシリアライズ オブジェクト UClass 変数A FProperty 変数B FProperty 変数C FProperty #UE4 | @UNREALENGINE Unversioned PropertySerializer アセットファイル
UPSのシリアライズ オブジェクト UClass 変数A FProperty 変数B FProperty 変数C FProperty #UE4 | @UNREALENGINE Unversioned PropertySerializer アセットファイル 直列データ
UPSのシリアライズ Unversioned PropertySerializer オブジェクト UClass 変数A FProperty 直列データ 変数B FProperty 直列データ 変数C FProperty 直列データ #UE4 | @UNREALENGINE アセットファイル
UPSのシリアライズ オブジェクト UClass Unversioned PropertySerializer アセットファイル ヘッダ 変数A FProperty 直列データ 変数B FProperty 直列データ 変数C FProperty 直列データ #UE4 | @UNREALENGINE
UPSのデシリアライズ オブジェクト UClass Unversioned PropertySerializer アセットファイル ヘッダ 変数A FProperty 直列データ 変数B FProperty 直列データ 変数C FProperty 直列データ #UE4 | @UNREALENGINE
UPSのデシリアライズ Unversioned PropertySerializer オブジェクト UClass 変数A FProperty 直列データ 変数B FProperty 直列データ 変数C FProperty 直列データ #UE4 | @UNREALENGINE アセットファイル
つまりUPSは、、、 #UE4 | @UNREALENGINE
つまりUPSは、、、 超シンプルで速い実装です! UPS #UE4 | @UNREALENGINE
UPSでのアセットの読み込み(失敗) オブジェクト アセットファイル A A このプロパティが パッケージビルドの バイナリから無く なってしまった B C C D D #UE4 | @UNREALENGINE
UPSでのアセットの読み込み(失敗) オブジェクト アセットファイル A A C B D C D #UE4 | @UNREALENGINE
UPSでのアセットの読み込み(失敗) オブジェクト アセットファイル A A C B D C D #UE4 | @UNREALENGINE
UPSでのアセットの読み込み(失敗) 旧来のTaggedPropertySerializationであれば、 このようなプロパティが増減しているケースでも 名前の照合などを使ってロードに成功しますが、 UPSはシンプルに処理しているので問題が出るケースがあります。 #UE4 | @UNREALENGINE
目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE
有効化方法 ● (Default)Engine.iniファイルで以下のフラグを有効化する [Core.System] CanUseUnversionedPropertySerialization=True ● パッケージ作成時に ‘Save packages without versions’にチェックを入れる ○ コマンドラインでパッケージしている場合はオプションに ‘-unversioned’ を追加する 以下 2020/11/15 追記 ● UATを利用している場合は、 常にクッカーに-Unversionedが指定されるため特別な操作は不要です。 ○ CIでクッカーを直接呼び出している場合、-unversioned指定が必要です。 #UE4 | @UNREALENGINE
-unversionオプションについて 各アセットに対して保存可能なエンジンのバージョンを示す数値を無効化し、 最新のバージョンでアセットが保存されていると仮定するオプションです。 この設定はエンジンを変更しながら運営を続けるようなタイトルでデータの破損 を検出、防止するために使われることがありますが、 バイナリ差分パッチ利用時は逆にサイズを増加させてしまうことがあります。 詳しくは アセットとパッケージのバージョンを管理する をご覧ください。 これから開発されるタイトルではunversionでのご利用をお勧めします。 https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/VersioningAssetsAndPackages/index.html #UE4 | @UNREALENGINE
目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE
パフォーマンス測定 同じプロジェクトをUPSのON/OFFでそれぞれパッケージを行い パフォーマンスを検証しました。 ● パッケージ設定 ● ● 設定等 ● ● ● Win64 test configuration IOStore無効 AsyncLoadingThread/EventDrivenLoader有効 ハードウェア ● PCIe接続のSSD上にパッケージを配置して計測 #UE4 | @UNREALENGINE
検証用レベル #UE4 | @UNREALENGINE
BP読み込み検証用アセット 下のようなたくさんのプロパティを持ったBPをレベルに配置して検証 UCLASS() class LOADINGTEST425_API AActorWithManyProperties : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties AActorWithManyProperties(); UFUNCTION(BlueprintCallable) static void RandomizeProperty( UObject* Ptr ); UPROPERTY(EditDefaultsOnly) int32 Value1; UPROPERTY(EditDefaultsOnly) int32 Value2; UPROPERTY(EditDefaultsOnly) int32 Value3; UPROPERTY(EditDefaultsOnly) int32 Value4; UPROPERTY(EditDefaultsOnly) int32 Value5; UPROPERTY(EditDefaultsOnly) int32 Value6; UPROPERTY(EditDefaultsOnly) int32 Value7; //以下略(232個) ... #UE4 | @UNREALENGINE
ファイルサイズ測定(レベル) WithoutUPS ParagonSample.umap ParagonSample.uexp #UE4 | @UNREALENGINE 338,567 Byte WithUPS 338,567 Byte 8,044,260 Byte 7,254,589 Byte
ファイルサイズ測定(BP) WithoutUPS WithUPS ManyProperties.uasset 5,980 Byte 5,980 Byte ManyProperties.uexp 7,203 Byte 1,137 Byte #UE4 | @UNREALENGINE
ファイルサイズ測定(BP-ThirdPersonBP) WithoutUPS ThirdPersonBP.uasset ThirdPersonBP.uexp #UE4 | @UNREALENGINE WithUPS 10,610 Byte 10,610 Byte 9,310 Byte 5,815 Byte
ファイルサイズ測定(マテリアル) WithoutUPS M_Down_Reference.uasset M_Down_Reference.uexp #UE4 | @UNREALENGINE WithUPS 4,204 Byte 4,204 Byte 234,498 Byte 225,087 Byte
BPデシリアライズ時間 UPS無効 #UE4 | @UNREALENGINE
BPデシリアライズ時間 UPS有効 #UE4 | @UNREALENGINE
レベルデシリアライズ時間 UPS無効 #UE4 | @UNREALENGINE
レベルデシリアライズ時間 UPS有効 #UE4 | @UNREALENGINE
デシリアライズ時間 Without UPS With UPS umap processing time 4.70 ms 1.60 ms ManyProperties x 18 0.27 ms 0.12 ms #UE4 | @UNREALENGINE
目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE
UPSまとめ ● UPSはプロパティのデシリアライズを効率化します ● ● ● 効果の大きさはアセット毎に変化 ● ● ● アセットサイズの削減 デシリアライズ時間の短縮(特にAsyncLoadingThreadのCPU処理時間に効果) ● 高速SSDやフラッシュメモリを利用可能でCPU側にボトルネックが発生する ハードウェアで特に効果が見込める 大量のノードを含むブループリントは相対的に改善効果が低いが 大半のアセットがプロパティを持っているため少なからず恩恵がある レベルの配置情報のデシリアライズ時間には効果が大きい 有効化には ● ● iniの編集が必要 (4.25 / 4.25plus) パッケージ作成時に-unversion指定が必要 #UE4 | @UNREALENGINE
リンク http://unrealengine.jp/unrealfest/ #UE4 | @UNREALENGINE
リンク EGJオンラインラーニングシリーズ https://www.unrealengine.com/ja/blog/connect-with-the-unreal-engine-community-online UE5 https://www.unrealengine.com/en-US/blog/a-first-look-at-unreal-engine-5 UnrealEngine Twitter @UnrealEngine UnrealEngineJP Twitter @UnrealEngineJP EGJ SlideShare https://www.slideshare.net/EpicGamesJapan/presentations #UE4 | @UNREALENGINE