UEにおける Cook 成果物(.uasset / .pak / .utoc / .ucas)の非決定的差分について(Deterministic Cooking の可否・推奨設定の相談)

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

Unreal Engine 5.6.1 環境で Cook/Packaging を実行した際、入力や設定が同一であるにもかかわらず、生成される成果物にバイナリ差分が発生する事象についてご相談です。

●発生している事象

同一マシン・同一設定(同一ブランチ/同一コミット・同一コマンドライン/同一ターゲット)のまま、連続して 2 回 Cook/Packaging を実行すると、Staging(および Cook 出力)内の以下のファイルに差分が出ます。

  • Cooked *.uasset(この段階で既に差分を確認)
  • それを入力として生成される *.pak
  • I/O Store 使用時の *.utoc / *.ucas

現状 *.uasset の段階で差分が発生しているため、.pak や .utoc / .ucas で差分が出ること自体は結果として自然であり、特定のコンテナ形式に限定した問題ではなく、Cook パイプライン全体の非決定性が根本要因ではないかと考えています。

●現時点の仮説(差分要因の候補)

現在調査中ではありますが、こちらの理解では、例えば以下のような可変要素が絡むことで、同一条件でも成果物のバイナリが一致しない可能性があると想定しています。

  • コード/プラグイン/モジュール構成の差異やロード順
  • AssetRegistry 情報の生成内容
  • PreloadDependency 等に起因する参照・並び順の変動
  • NameMap の内容・配置(NameOffset / NameCount 等)が変動し得る
  • Shader 生成(派生データ)に由来する差分が Cook 後工程へ波及する可能性

結果として *.uasset が一致せず、.pak や .utoc / .ucas の生成結果にも差分が伝播する、という構図を想定しています。

●相談したいこと

上記を踏まえ、以下について見解と推奨を伺いたいです。

1. UE5.6.1 において、同一条件で Cook/Packaging を行っても *.uasset / *.pak / *.utoc / *.ucas に差分が発生し得る挙動は、現設計として「想定内」でしょうか。

2.想定内である場合、差分は主にどのレイヤーで発生することが多いでしょうか。

  • 例:NameMap 生成、CustomVersion、AssetRegistryData、PreloadDependency、I/O Store コンテナ生成時の並び順/シード等

3.Cook の再現性(決定性)を最大化するために、Epic として推奨している Deterministic Cooking のベストプラクティスがあれば教えてください。

  • Project Settings/Cooker オプションで有効化すべき設定
  • Cook パイプライン上で「非決定的になりやすい」既知のポイント(回避策があれば併せて)
  • .pak/I/O Store を用いた配信における想定運用モデル(差分配信・CI 等での取り扱い)

もし本件が既知の課題・制限事項、または将来的な改善対象であれば、参考になるドキュメント/Issue/推奨バージョン(例:5.6.x 以降での改善状況)をご教示いただけますと幸いです。

本件はゲーム実行上すぐに問題化しないケースが多い一方で、CI/差分配信/検証工程の都合上、同一入力に対して同一の Cook 成果物を得たい要求があります。

成果物差分が発生する背景や設計意図を正しく理解したうえで、どのように解消するか、実運用ではどう向き合うのが望ましいかについて、見解を伺えますと幸いです。

お手数をおかけしますが、よろしくお願いいたします。

[Attachment Removed]

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

1. UE5.6.1 において、同一条件で Cook/Packaging を行っても *.uasset, *.pak, *.utoc, *.ucas に差分が発生し得る挙動は、現設計として「想定内」でしょうか。

基本的には「同一条件で再クック/パッケージを行った際に、 *.uasset, *.pak, *.utoc, *.ucas に差分が発生しないことが理想的である」と認識しており、不具合など何らかの技術的な問題によって差分が発生しているものと判断しております。つまり同一条件で差分が発生する挙動は(既知の不具合以外においては)想定外の挙動であり、修正の必要がある事項だと考えます。

2.想定内である場合、差分は主にどのレイヤーで発生することが多いでしょうか。

挙げて頂いた箇所は良くある非決定的な差分が発生しやすいケースに該当しますが、それ以外にもどの領域・機能においても発生する可能性があります。例えば CL#30684977で修正された問題は Niagraに関するもので、CL#40747641 で修正された問題は複数プラットフォーム同時にクックする操作を行うと発生していた問題で、傾向はあまり問わず発生する可能性があります。

3.Cook の再現性(決定性)を最大化するために、Epic として推奨している Deterministic Cooking のベストプラクティスがあれば教えてください。

前提として、クック時に非決定論的動作になるとパッチにも影響するため(アセットの差分をパッチに含めようとした際に関係のないアセット、つまり変更していないアセットが意図せずパッチパッケージに含まれてしまい巨大なパッチ差分ファイルができてしまうことは避けたいので)、修正したい事項であると考えております。そのため非決定論的挙動がある場合は修正を行い、極力差分が発生しない形でリリースすることを目標としています。

  • Project Settings/Cooker オプションで有効化すべき設定

特に最終提出用のアプリケーションパッケージにおいて特別に設定を追加する必要があることはないのですが、一般的にゲーム内でアセットのロード順を指定することでロードの最適化を目的とした FileOpenOrder の設定は利用するべき設定になります。古いバージョンドキュメントしかなく恐縮ですが、以下のドキュメントの「pak ファイルの順序付け」に該当する部分になります。IOStoreを有効にする場合はコンテナファイル側でこの設定が反映されます。

https://dev.epicgames.com/documentation/ja\-jp/unreal\-engine/packaging\-projects?application\_version\=4\.27\#pakファイルの順序付け

それ以外では非決定論的な問題が発生した場合に問題を切り分けるためのオプションなどがございます。この問題については古くから認識して都度対処してきましたが、以下の記事はこれを説明する上で参考になるかもしれません。2年前の情報のためやや最新の情報とは異なる点があるかもしれませんが、問題の掘り下げ方やデバッグの方法などはそのまま活用できるはずです。もし現在認識なされている問題がありましたら、ここで示すようなどのプロパティに問題が発生しているかをご共有頂けますと、問題の再現と修正の役に立ちますのでご共有頂けますと大変助かります。

  • Cook パイプライン上で「非決定的になりやすい」既知のポイント(回避策があれば併せて)

UE5.6をご利用なされている場合は .pak には.iniファイルや.shaderbytecodeなどが格納されていると思うので、もし.pakファイルで差分がある場合は .shaderbytecodeでの差分が発生しているかもしれません。また、ブループリントのコンストラクタでランダム関数を利用されて何らかのパラメータに保存されているようなケースでは、アセットのクック毎に必ずコンストラクタが走って差分が発生している可能性があります。そのようなケースの対処方法については、上記のブログ記事の中で回避策などを記載しております。

.utoc, .ucas, .upakファイルで差分が発生することは、格納されているファイルの差分によるものであるため、まずはアセットをクック(ステージングやパッケージングは実行せずそのまえのクックまでを実行)して差分があるかどうかを見て、問題がある場合はどのような条件に依存するかを考慮しながら問題を絞り込んでいくのが定石になるかと思われます(例えば、関連するアセットだけを別のプロジェクトにMigrateしてクックしてみる、シンプルなテンプレートプロジェクトでも非決定的な問題が発生するかどうかを試してみる、等)。

  • .pak/I/O Store を用いた配信における想定運用モデル(差分配信・CI 等での取り扱い)

これは非常にコンテンツ次第なところもありますが、極力pakファイル/.ucasファイルは1つの巨大なチャンクとせずに適切に分割するべきです。これは差分パッチの適用にあたっての挙動が動作するプラットフォームによっても変わるので一概には言えませんが、巨大なチャンクを作成すると1つのアセットの差分でも巨大なチャンク丸ごとを差し替えるような必要が出てくるので、アセットの差分が発生したとしてもそれが許容される範囲であるようにチャンクのサイズをコントロールして設定する必要があります。

この件については私自身「完全に非決定的な問題がない状態となった」といえる状況を見たことがないので何らかの問題が残っている、または新たな問題が発生している可能性というのが想定される点において恐縮なのですが、問題があれば都度修正する必要があるという認識ですので、問題がある場合は順次対応させて頂ければと考えております。

[Attachment Removed]

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

ご丁寧なご回答をありがとうございました。

内容を踏まえ、現時点では特定の設定や回避策で完全な決定性を保証するのは難しく、非決定的な挙動については都度修正・改善を進めていくという方向性で理解いたしました。

現行プロジェクトでは、差分が実運用上問題となるケース(CI/差分配信など)が確認された際に、まずは原因を個別に切り分けたうえで、必要に応じて UDNを通じて再現手順を共有・報告させていただく形で検討させていただきます。

引き続き、Cook パイプラインの決定性向上についてフィードバックを継続させていただければ幸いです。

改めましてご対応ありがとうございました。

[Attachment Removed]

ご確認頂きありがとうございます。はい、ご理解いただきありがとうございます。

もし個別で問題がございましたら別途スレッドを立てて頂けますと順次対応させて頂きます。

[Attachment Removed]