複数プロジェクトで異なる Zen AutoLaunch DataPath を使用した場合に local Zen DDC が削除される挙動について

複数の Unreal Engine プロジェクトを同一エンジンバージョンで運用している環境における、Zen DDC の挙動について確認させてください。

現在、各プロジェクトでは local Zen DDC のデータディレクトリをプロジェクト配下に置くため、以下のような設定を行っています。

[Zen.AutoLaunch]

DataPath=%GAMEDIR%Zen/Data

また、DDC backend graph は local Zen DDC と shared Zen DDC を参照する構成です。

[DerivedDataBackendGraph]

Root=(Type=KeyLength, Length=120, Inner=AsyncPut)

AsyncPut=(Type=AsyncPut, Inner=Hierarchy)

Hierarchy=(Type=Hierarchical, Inner=ZenLocal, Inner=ZenShared)

ZenLocal=(Type=Zen, ServerID=Local)

ZenShared=(Type=Zen, ServerID=Shared)

[StorageServers]

Shared=(Host=“http://<SHARED_ZEN_DDC_HOST>:<PORT>”, Namespace=“<PROJECT_NAMESPACE>”, EnvHostOverride=UE-ZenSharedDataCacheHost, CommandLineHostOverride=ZenSharedDataCacheHost, DeactivateAt=60)

確認している問題は、Project A -> Project B -> Project A のように、異なるプロジェクトを交互に起動した場合です。

Installed Build を利用したエディタ起動時に以下のユーザー単位の設定が更新されます。

<LOCAL_APP_DATA>/UnrealEngine/<UE_VERSION>/Saved/Config/WindowsEditor/EditorSettings.ini

[/Script/UnrealEd.ZenServerSettings]

InUseDefaultDataPath=…

この設定は同一エンジンバージョンで共有されるため、プロジェクトごとに異なる Zen DataPath を使っていると、別プロジェクトでエディタを起動するたびに値が切り替わります。

その結果、起動時に以下のようなログが出力されます。

LogZenServiceInstance: Display: Migrating default data path from ‘<PROJECT_B_ROOT>/Zen/Data’ to ‘<PROJECT_A_ROOT>/Zen/Data’. Old location will be deleted.

関連する実装では、以下の処理により、以前の local Zen DDC のデータディレクトリが削除されているように見えます。

IFileManager::Get().DeleteDirectory(*InUseDefaultDataPath, false, true);

このため、あるプロジェクトを起動すると、別プロジェクトで使用していた local Zen DDC のデータディレクトリが削除され、削除された側のプロジェクトを次回起動した際に、派生データの再生成または shared Zen DDC からの再取得が発生します。

確認したい点は以下の通りです。

  1. 同一エンジンバージョンで複数プロジェクトが異なる [Zen.AutoLaunch] DataPath を使っている場合、以前の InUseDefaultDataPath のディレクトリが削除される挙動は想定通りでしょうか。
  2. プロジェクト設定またはエディタ設定で、以前の local Zen DDC のデータディレクトリを削除しないようにする方法はありますでしょうか。
  3. エンジン側を修正し、以前のディレクトリを削除せず InUseDefaultDataPath の更新だけ行うようにした場合、既知の副作用や、削除が必要になるケースはありますでしょうか。
  4. 同一エンジンバージョンを複数プロジェクトで利用しつつ、プロジェクトごとの local Zen DDC を持ちたい場合、推奨される構成はありますでしょうか。
  5. 今後、以前の local Zen DDC のデータディレクトリを削除しないオプション等、複数プロジェクト運用向けの機能を追加していただくことは可能でしょうか。

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

[Attachment Removed]

再現手順[Attachment Removed]

大変お待たせしてしまい大変恐縮です。

> 1. 同一エンジンバージョンで複数プロジェクトが異なる [Zen.AutoLaunch] DataPath を使っている場合、以前の InUseDefaultDataPath のディレクトリが削除される挙動は想定通りでしょうか。

想定通りです。DataPathのデフォルト値がは

DataPath=%ENGINEVERSIONAGNOSTICINSTALLEDUSERDIR%Zen/Dataでありエンジンに対して共有のパスが設定されています。このパス指定で起動したZenServer複数のプロジェクトから共有で利用されることを想定しています。

この共有パスが切り替わった場合に旧設定のパスを削除します。FZenServiceInstance::AutoLaunchのコメントにもあるように無意識にストレージを無駄に消費しないようにするための措置です。

> 2.プロジェクト設定またはエディタ設定で、以前の local Zen DDC のデータディレクトリを削除しないようにする方法はありますでしょうか。

環境変数やEditorPreference(レジストリへの書き込み)の設定無しで行うことは難しいです。

ひと手間掛かりますが各自がEditorPreferenceで、Global Local DDC Pathに

?LocalDataCachePathと先頭に?のついた文字列を付与すると後述の設定の様に各プロジェクトのDefaultEngine.iniでGlobalLocalDDCPathに設定した変数名からプロジェクト固有のパスを指定することが出来ます。

この場合InUseDefaultDataPath=Falseなのでフォルダの削除は起きません。(DetermineLocalDataCachePath関数をご覧ください)

[DerivedDataCacheSettings]
LocalDataCachePath=%GAMEDIR%Zen/Data

> 3. エンジン側を修正し、以前のディレクトリを削除せず InUseDefaultDataPath の更新だけ行うようにした場合、既知の副作用や、削除が必要になるケースはありますでしょうか。

環境変数やEditorPreference(レジストリ)経由で固有のパスを指定したことになるのと同等の動作になります。個々のパスのストレージの管理はユーザーが行うことになります。

> 4. 同一エンジンバージョンを複数プロジェクトで利用しつつ、プロジェクトごとの local Zen DDC を持ちたい場合、推奨される構成はありますでしょうか。

共通のLocal Zen DDCを使うデフォルトの設定で必要あらばネームスペースを指定して分離することが標準的な構成です。

改造無しだとユーザー毎にひと手間掛かりますが2の回答の方法しかないと思います。

> 5. 今後、以前の local Zen DDC のデータディレクトリを削除しないオプション等、複数プロジェクト運用向けの機能を追加していただくことは可能でしょうか。

通常は、様々な方法による共有のZenDataPathの指定で複数プロジェクトを運用しても大きな問題がでるという報告はありません。

なにかクラッシュなどの致命的な問題などや分離せざるを得ないシナリオなどがあればバグ登録や要望を追加することはできます。

ただ2の方法も含め代替手法があるため強い動機があればお聞かせ願えますと幸いです。

[Attachment Removed]

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

「共通のLocal Zen DDCを使うデフォルトの設定で必要あらばネームスペースを指定して分離することが標準的な構成」とのご説明、承知いたしました。

つきましては、プロジェクトごとに

[Zen.AutoLaunch]
DataPath=%GAMEDIR%Zen/Data

としてDataPathを分離する方針は取りやめ、DataPathは共有のデフォルト値のまま利用し、

[StorageServers]
Local=(Namespace="xxx.ddc")

のようにNamespaceでプロジェクトごとに分離する構成へ変更することで、今回の事象(別プロジェクト起動時に旧DataPathのディレクトリが削除される挙動)を回避しようと思います。

[Attachment Removed]