複数のChunkに含まれるはずのデータが一つのChunkにしか含まれません

Chunk1とChunk5に異なるMapを追加し、両方のMapから同じStaticMeshを使用しているとします。
この状態でChunkを作成すると、AssetAudit上では下の絵のように、共有されているStaticMeshはChunk1と5の両方に含まれている表示になります。

この状態で、Chunk5のみをDLした状態でChunk5のMapを読み込むと、1+5に含まれるはずのメッシュが表示されません。さらにChunk1をDLした状態でChunk5のMapを読み込むと、メッシュは正しく表示されます。

このことから、1+5のメッシュはChunk1にしか含まれていないと思われます。

考えられる原因はありますでしょうか?

宜しくお願いします。

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

まず、頂いた画像と情報を元に同じ現象を再現することができました。

これらの行はチャンク 100 とチャンク 101 がチャンク 11
の子であることを指定します。チャンク 11 に含まれているアセットはチャンク
100 またはチャンク 101
には含まれないということです。デフォルトではすべてのチャンクがチャンク 0
の子になっています。つまり初回起動チャンクが無駄に他のチャンクに複製されることはありません。チャンクの階層を正しく設定することによって、必要なディスク
サイズをプレイヤーのデバイス上で最小化し、コンテンツの重複を防ぎました。

チャンク化による高速ダウンロードを可能にするツールと最適化の考察 - Unreal Engine

上記の公式ブログ記事の内容から1+5のメッシュはChunk1,5両方に重複するという仕様だと考えていたのですが、UE4.22にて以下の内容が入っていることを確認したことで、ブログ記事の内容に誤りがあったのではないかと疑っています。たしかにbForceOneChunkPerFileが無効の状態ですと、今回の場合ですとChunk1,5両方に重複することを確認しました。

New: Changed pak code to allow placing
the same file into multiple paks if
requested by the cooker. This can be
disabled with bForceOneChunkPerFile.

bForceOneChunkPerFileに関するコード追加・変更はCL-4688816にて行われており、その中でもCopyBuildToStagingDirectory.Automation.cs に関する変更が本件に関係している可能性が高いと思われます。

現在BattleBrekers, UE4.21, UE4.22における実装・挙動を比較し、正確な仕様の把握を行っています。大変申し訳ありませんが、もう少々お待ちいただけますと幸いです。

よろしくお願いいたします。

調査ありがとうございます!
4.21だと仕様の可能性が高く、4.22だと設定で回避可能、ということですね、現状に関しては一旦把握できました。ありがとうございました!
追加情報があればお知らせいただけると助かります。

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

原因は CopyBuildToStagingDirectory.Automation.cs における CreatePaksUsingChunkManifests 関数の実装にありました。

private static void CreatePaksUsingChunkManifests(ProjectParams Params, DeploymentContext SC)
{
...
foreach (var StagingFile in StagingManifestResponseFile)
{
	bool bAddedToChunk = false;
	for (int ChunkIndex = 0; !bAddedToChunk && ChunkIndex < ChunkDefinitions.Count; ++ChunkIndex)
	{
	...
		TargetChunk.ResponseFile.Add(StagingFile.Key, StagingFile.Value);
		bAddedToChunk = true;
	...
	}
...
}

上記のコードでは、 Chunk.ManifestStagingFile(中身はアセットのファイルパス)が含まれる場合、そのChunkに StagingFile を追加登録するという処理を行っています。ここで問題になっているのが Chunkへの登録処理が行われると bAddedToChunk =true が走るという点です。このせいでfor文を抜けてしまうため、候補となるChunkの中で最もChunk IDが小さいChunkにしかアセットが含まれないという処理になっていました。

BattleBreakersで使用されているエンジンコードを確認した所、上記のような処理は見当たりませんでした。そのため、Chunk間のアセット重複が生じる挙動になっていたため、ブログ記事に書かれている対応をしていたようです。

もしUE4.21時点で重複を強制する場合はfor文における !bAddedToChunk を削除すればよいはずです(申し訳ありませんが十分な検証ができていないため、動作保証はできません)。

よろしくお願いいたします。

追加の調査ありがとうございます!
4.22移行前に必要になった場合は教えていただいた方法で対処したいと思います!