UGameplayStatics::SaveGameToMemory 実行後のデータサイズに関して

お世話になっております。

セーブデータのシリアライズ後のサイズについてのご質問になります。

Win64/WinGDK では独自実装の処理、PS5/XSX では UGameplayStatics::AsyncSaveGameToSlot を使用して非同期セーブを実行しております。

上記のいずれにおいても、セーブデータのシリアライズ処理には共通で UGameplayStatics::SaveGameToMemory を使用しております。

こちらのシリアライズ処理の直後、データサイズが約 5~10 倍ほどにまで増大してしまっており、実際のセーブデータのファイルサイズもシリアライズ後の数値に近いものになっています。

この時引数に渡している SaveGameObject は、プラットフォーム毎に多少差異はありますが約2MBほどとなっています。

各プラットフォームのシリアライズ後のサイズは下記の通りとなっています。

`Win64
: 約 12~22 MB

PS5 / XSX
: 約 22 MB`

こちらのシリアライズ後のデータサイズの増大について、意図された挙動となりますでしょうか?

もしコンフィグやその他設定等でサイズの増大を回避できるのであれば、情報を頂きたく存じます。

(下記のリンク先は、本スレッドを英語に翻訳した英文スレッドですが、Epic Games のサポートチームが内部的に使用するものですので、ユーザーの方に利用していただく必要はございません。サポートは、この日本語スレッドに日本語で表示されることになります。)

[The data size increases several times after [Content removed]

(以下は、サポート担当の Thomeczek Sebastian によるコメントを翻訳したものです。)

お世話になっております。

> こちらのシリアライズ後のデータサイズの増大について、意図された挙動となりますでしょうか?

シリアライズ後のデータサイズが増加するのは仕様です (意図された挙動です) 。これは、FObjectAndNameAsStringProxyArchive を経由したシリアライズに由来している可能性が非常に高いです。この種のアーカイブは、すべての UObject のポインタ (8バイト) を文字列に変換しますが、通常、ポインタの数倍のサイズになります (文字列/オブジェクト名の長さによります)。それにより、シリアライズされたデータが増加することになります。特に、SaveGame オブジェクトに多くのオブジェクトの参照が含まれている場合は顕著です。

この問題は、避けることができません。と言いますのも、セーブデータを復元 (デシリアライズ) する際にオブジェクトを一意に識別する必要があり、そのためにオブジェクト名が必要であるからです。

> もしコンフィグやその他設定等でサイズの増大を回避できるのであれば、情報を頂きたく存じます。

お勧めできるやり方としては、結果として得られる配列を圧縮することとなります。こうすると、シリアライズされたバッファ内の文字列によって、良好な圧縮比が得られるはずです。

残念ながら、SaveGame システムはデフォルトで圧縮をサポートしていないため、独自の実装で圧縮を行わなければならず、プラットフォーム固有のものをラップする必要があります。

FCompression::CompressMemory(NAME_Oodle, …) 経由で Oodle を使用することによって、SaveGame API から返された TArray を圧縮/解凍することができます。

ご回答ありがとうございます。

シリアライズ後のデータサイズが増加するのは仕様で意図通りの挙動とのこと、承知致しました。

ひとまずはご案内いただいた通り、シリアライズ後のデータ配列を圧縮することでサイズを抑えられないかを検証させていただきます。