【UE4.25 新機能】新しいシリアライゼーション機能「Unversioned Property Serialization」について【2020】

60K Views

November 15, 20

スライド概要

講演動画はこちら:https://youtu.be/V5tUNlfiJ5s

UE4.25でクック済みゲームのアセットシリアライゼーションに
改善された処理方法を選択できるようになりました。
本プレゼンテーションでは「シリアライゼーション」について解説した後
新しいシリアライゼーションの有効化方法、
どのような部分が改善されたのかを説明いたします。

Software Engineer Developer Relations, 鈴木 孝司 ( https://twitter.com/wankotank )

profile-image

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

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

Unversioned Property Serialization Epic Games Japan Software Engineer - Developer Relations Takashi Suzuki

2.

はじめに #UE4 | @UNREALENGINE

3.

はじめに #UE4 | @UNREALENGINE

4.

はじめに #UE4 | @UNREALENGINE

5.

はじめに #UE4 | @UNREALENGINE

6.

はじめに UE4.25でクック済みゲームのアセットシリアライゼーションに 改善された処理方法を選択できるようになりました。 本プレゼンテーションでは「シリアライゼーション」について解説した後 新しいシリアライゼーションの有効化方法、 どのような部分が改善されたのかを説明いたします。 #UE4 | @UNREALENGINE

7.

https://docs.unrealengine.com/ja/Support/Builds/ReleaseNotes/4_25/index.html #UE4 | @UNREALENGINE

8.

目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE

9.

目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE

10.

シリアライズとは RuntimeObject UPROPERTY付き 変数 c++変数 #UE4 | @UNREALENGINE

11.

シリアライズとは ABananaCharacter #UE4 | @UNREALENGINE

12.

シリアライズとは ABananaCharacter #UE4 | @UNREALENGINE

13.

シリアライズとは ABananaCharacter プロパティ c++変数 #UE4 | @UNREALENGINE

14.

シリアライズとは ABananaCharacter UClass FProperty UPROPERTY付き 変数 FProperty FProperty FProperty UClassはオブジェクトの構造を表現するデータ構造です。 #UE4 | @UNREALENGINE

15.

シリアライズとは シリアライズされた データのコンテナ ABananaCharacter UClass FProperty UPROPERTY付き 変数 FProperty FProperty FProperty #UE4 | @UNREALENGINE 直列化済みデータ

16.

シリアライズとは シリアライズされた データのコンテナ ABananaCharacter UPROPERTY付き 変数 UClass FProperty FProperty FProperty FProperty c++変数 #UE4 | @UNREALENGINE Archive

17.

シリアライズとは シリアライズされた データのコンテナ ABananaCharacter UPROPERTY付き 変数 UClass FProperty FProperty FProperty 直列化済みデータ FProperty c++変数 UE4におけるシリアライズはメモリ上のオブジェクトから UClassで表現されるプロパティを通してデータを収集し直列化する処理です。 #UE4 | @UNREALENGINE

18.

シリアライズとは メモリ上のオブジェクトが持つパラメーターを クラスが持つプロパティ情報を参照しながら収集し 扱いやすいように直列化すること #UE4 | @UNREALENGINE

19.

デシリアライズ ABananaCharacter UPROPERTY付き 変数 UClass FProperty FProperty FProperty FProperty c++変数 #UE4 | @UNREALENGINE 直列化済みデータ

20.

デシリアライズ ABananaCharacter UPROPERTY付き 変数 UClass FProperty FProperty FProperty FProperty c++変数 #UE4 | @UNREALENGINE 直列化済みデータ

21.

デシリアライズ ABananaCharacter UPROPERTY付き 変数 UClass FProperty FProperty FProperty FProperty c++変数 #UE4 | @UNREALENGINE 直列化済みデータ

22.

シリアライズはどのような場面で 利用されているのでしょうか? #UE4 | @UNREALENGINE

23.

シリアライズの用途 RuntimeObject #UE4 | @UNREALENGINE シリアライズ

24.

シリアライズの用途 アセットの保存、読込 DuplicateObject RuntimeObject シリアライズ Undo ネットワークコードの送受信データ Cook済みアセットの保存・読込 などなど #UE4 | @UNREALENGINE

25.

シリアライズの用途 アセットの保存、読込 DuplicateObject RuntimeObject シリアライズ Undo ネットワークコードの送受信データ Cook済みアセットの保存・読込 などなど #UE4 | @UNREALENGINE

26.

目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE

27.

二つのシリアライズ処理 #UE4 | @UNREALENGINE

28.

二つのシリアライズ処理 4.24以前 エディタでアセットを保存したり読み込む TaggedPropertySerializer (TPS) Cook時にアセットを保存する Cook済みビルドでアセットを読み込む #UE4 | @UNREALENGINE

29.

二つのシリアライズ処理 TaggedPropertySerializer (TPS) 4.25から エディタでアセットを保存したり読み込む Cook時にアセットを保存する UnversionedPropertySerializer (UPS) Cook済みビルドでアセットを読み込む #UE4 | @UNREALENGINE

30.

TPSのシリアライズ UClass プロパティ #UE4 | @UNREALENGINE TaggedPropertySerializer アセットファイル uasset

31.

TPSのシリアライズ UClass TaggedPropertySerializer FProperty プロパティ #UE4 | @UNREALENGINE アセットファイル uasset

32.

TPSのシリアライズ UClass FProperty プロパティ #UE4 | @UNREALENGINE TaggedPropertySerializer FPropertyTag アセットファイル uasset

33.

PropertyTag ● 型 ● ● #UE4 | @UNREALENGINE コンテナ型のサイズ 構造体の名前 ● ● 名前 GUID ● ● ● プロパティのリネーム追跡 型の変化への追従 float->int など プロパティリダイレクタ

34.

TPSのシリアライズ UClass FProperty プロパティ TaggedPropertySerializer FPropertyTag アセットファイル uasset FPropertyTag 直列データ #UE4 | @UNREALENGINE

35.

TPSのデシリアライズ UClass TaggedPropertySerializer FProperty プロパティ アセットファイル uasset FPropertyTag 直列データ #UE4 | @UNREALENGINE

36.

TPSのデシリアライズ UClass FProperty TaggedPropertySerializer FPropertyTag アセットファイル uasset プロパティ 直列データ #UE4 | @UNREALENGINE

37.

TPSのデシリアライズ TaggedPropertySerializer UClass FProperty プロパティ FPropertyTag アセットファイル uasset 検索! 直列データ #UE4 | @UNREALENGINE

38.

TPSのデシリアライズ UClass FProperty TaggedPropertySerializer FPropertyTag アセットファイル uasset プロパティ 直列データ #UE4 | @UNREALENGINE

39.

TPSのシリアライズ UClass FProperty TaggedPropertySerializer FPropertyTag アセットファイル uasset 変数 FPropertyTag #UE4 | @UNREALENGINE

40.

TaggedPropertySerialization ● プロパティタグによってデータの互換性をサポート ● 変数毎にプロパティタグを付加 ● データをメモリに戻す際に検索を行う #UE4 | @UNREALENGINE

41.

UnversionedPropertySerializationへ ● 昨今は差分パッチによる配布が利用可能 ● そのため実装が追加に伴い対応データも変更する ● 次世代機の高速ストレージ 高効率な UPSを提供 #UE4 | @UNREALENGINE

42.

UPSのシリアライズ オブジェクト UClass 変数A FProperty 変数B FProperty 変数C FProperty #UE4 | @UNREALENGINE Unversioned PropertySerializer アセットファイル

43.

UPSのシリアライズ オブジェクト UClass 変数A FProperty 変数B FProperty 変数C FProperty #UE4 | @UNREALENGINE Unversioned PropertySerializer アセットファイル

44.

UPSのシリアライズ オブジェクト UClass 変数A FProperty 変数B FProperty 変数C FProperty #UE4 | @UNREALENGINE Unversioned PropertySerializer アセットファイル 直列データ

45.

UPSのシリアライズ Unversioned PropertySerializer オブジェクト UClass 変数A FProperty 直列データ 変数B FProperty 直列データ 変数C FProperty 直列データ #UE4 | @UNREALENGINE アセットファイル

46.

UPSのシリアライズ オブジェクト UClass Unversioned PropertySerializer アセットファイル ヘッダ 変数A FProperty 直列データ 変数B FProperty 直列データ 変数C FProperty 直列データ #UE4 | @UNREALENGINE

47.

UPSのデシリアライズ オブジェクト UClass Unversioned PropertySerializer アセットファイル ヘッダ 変数A FProperty 直列データ 変数B FProperty 直列データ 変数C FProperty 直列データ #UE4 | @UNREALENGINE

48.

UPSのデシリアライズ Unversioned PropertySerializer オブジェクト UClass 変数A FProperty 直列データ 変数B FProperty 直列データ 変数C FProperty 直列データ #UE4 | @UNREALENGINE アセットファイル

49.

つまりUPSは、、、 #UE4 | @UNREALENGINE

50.

つまりUPSは、、、 超シンプルで速い実装です! UPS #UE4 | @UNREALENGINE

51.

UPSでのアセットの読み込み(失敗) オブジェクト アセットファイル A A このプロパティが パッケージビルドの バイナリから無く なってしまった B C C D D #UE4 | @UNREALENGINE

52.

UPSでのアセットの読み込み(失敗) オブジェクト アセットファイル A A C B D C D #UE4 | @UNREALENGINE

53.

UPSでのアセットの読み込み(失敗) オブジェクト アセットファイル A A C B D C D #UE4 | @UNREALENGINE

54.

UPSでのアセットの読み込み(失敗) 旧来のTaggedPropertySerializationであれば、 このようなプロパティが増減しているケースでも 名前の照合などを使ってロードに成功しますが、 UPSはシンプルに処理しているので問題が出るケースがあります。 #UE4 | @UNREALENGINE

55.

目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE

56.

有効化方法 ● (Default)Engine.iniファイルで以下のフラグを有効化する [Core.System] CanUseUnversionedPropertySerialization=True ● パッケージ作成時に ‘Save packages without versions’にチェックを入れる ○ コマンドラインでパッケージしている場合はオプションに ‘-unversioned’ を追加する 以下 2020/11/15 追記 ● UATを利用している場合は、 常にクッカーに-Unversionedが指定されるため特別な操作は不要です。 ○ CIでクッカーを直接呼び出している場合、-unversioned指定が必要です。 #UE4 | @UNREALENGINE

57.

-unversionオプションについて 各アセットに対して保存可能なエンジンのバージョンを示す数値を無効化し、 最新のバージョンでアセットが保存されていると仮定するオプションです。 この設定はエンジンを変更しながら運営を続けるようなタイトルでデータの破損 を検出、防止するために使われることがありますが、 バイナリ差分パッチ利用時は逆にサイズを増加させてしまうことがあります。 詳しくは アセットとパッケージのバージョンを管理する をご覧ください。 これから開発されるタイトルではunversionでのご利用をお勧めします。 https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/VersioningAssetsAndPackages/index.html #UE4 | @UNREALENGINE

58.

目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE

59.

パフォーマンス測定 同じプロジェクトをUPSのON/OFFでそれぞれパッケージを行い パフォーマンスを検証しました。 ● パッケージ設定 ● ● 設定等 ● ● ● Win64 test configuration IOStore無効 AsyncLoadingThread/EventDrivenLoader有効 ハードウェア ● PCIe接続のSSD上にパッケージを配置して計測 #UE4 | @UNREALENGINE

60.

検証用レベル #UE4 | @UNREALENGINE

61.

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

62.

ファイルサイズ測定(レベル) WithoutUPS ParagonSample.umap ParagonSample.uexp #UE4 | @UNREALENGINE 338,567 Byte WithUPS 338,567 Byte 8,044,260 Byte 7,254,589 Byte

63.

ファイルサイズ測定(BP) WithoutUPS WithUPS ManyProperties.uasset 5,980 Byte 5,980 Byte ManyProperties.uexp 7,203 Byte 1,137 Byte #UE4 | @UNREALENGINE

64.

ファイルサイズ測定(BP-ThirdPersonBP) WithoutUPS ThirdPersonBP.uasset ThirdPersonBP.uexp #UE4 | @UNREALENGINE WithUPS 10,610 Byte 10,610 Byte 9,310 Byte 5,815 Byte

65.

ファイルサイズ測定(マテリアル) WithoutUPS M_Down_Reference.uasset M_Down_Reference.uexp #UE4 | @UNREALENGINE WithUPS 4,204 Byte 4,204 Byte 234,498 Byte 225,087 Byte

66.

BPデシリアライズ時間 UPS無効 #UE4 | @UNREALENGINE

67.

BPデシリアライズ時間 UPS有効 #UE4 | @UNREALENGINE

68.

レベルデシリアライズ時間 UPS無効 #UE4 | @UNREALENGINE

69.

レベルデシリアライズ時間 UPS有効 #UE4 | @UNREALENGINE

70.

デシリアライズ時間 Without UPS With UPS umap processing time 4.70 ms 1.60 ms ManyProperties x 18 0.27 ms 0.12 ms #UE4 | @UNREALENGINE

71.

目次 ● シリアライズとは ● 二つのシリアライズ処理 ● UPSの有効化 ● パフォーマンス測定 ● まとめ #UE4 | @UNREALENGINE

72.

UPSまとめ ● UPSはプロパティのデシリアライズを効率化します ● ● ● 効果の大きさはアセット毎に変化 ● ● ● アセットサイズの削減 デシリアライズ時間の短縮(特にAsyncLoadingThreadのCPU処理時間に効果) ● 高速SSDやフラッシュメモリを利用可能でCPU側にボトルネックが発生する ハードウェアで特に効果が見込める 大量のノードを含むブループリントは相対的に改善効果が低いが 大半のアセットがプロパティを持っているため少なからず恩恵がある レベルの配置情報のデシリアライズ時間には効果が大きい 有効化には ● ● iniの編集が必要 (4.25 / 4.25plus) パッケージ作成時に-unversion指定が必要 #UE4 | @UNREALENGINE

73.

リンク http://unrealengine.jp/unrealfest/ #UE4 | @UNREALENGINE

74.

リンク 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