DDC は 派生データ キャッシュ を表します。
Unreal Engine アセットの多くは使用する前に追加の「派生データ」を必要とします。(シェーダーを持つマテリアルが簡単な例です)。マテリアルをレンダリングする前に、エディターが実行するプラットフォーム用にシェーダーをコンパイルする必要があります。
派生データはサイズが大きく、再生成の必要な場合があるため、ソース コントロールにチェックインされません。その代わりに派生データキャッシュ (DDC) に保持されます。
DDC の保存場所
プロジェクトとシステムの構成方法によって、高速から低速にわたる階層の中に複数のDDC キャッシュが存在する可能性があります。派生データを評価するとき、システムは次のことを実行して、データにアクセスできる速さを決定します。
- 派生データが必要な場合、データが見つかるまで、まず最速のキャッシュがチェックされ、次に速いキャッシュがチェックされます。
- データが見つかると、最速のローカルキャッシュにコピーされるため、次回のアクセスが高速になります。
- データが見つからない場合に初めて生成されて非同期でキャッシュにコピーされるため、その後は (場合によってはチームも) データを利用できるようになります。
DDC に保存されているコンテンツは使い捨てですが、.uasset ファイルに保存されているデータを使用していつでも再生成できます。これらの派生フォーマットを外部に保存すると、ソース アセット ファイルを変更しなくても、エンジンで使用されるフォーマットを簡単に追加または変更できます。
DDC のタイプ
通常は、少なくとも次の 2 つのキャッシュがあります。
- Boot DDC: 起動時間を増やすためにメモリに読み込まれる起動ファイル。
- 例:ProjectDir/DerivedDataCache/Boot.ddc
- Local DDC: プロジェクトの派生データ。
- 例:EngineDir/DerivedDataCache
ただし、プロジェクトが DDC Pak または Shared DDC を使用するように設定されている場合もあります。
DDC Pak
Epic Games Store から Unreal Engine をダウンロードすると、エンジンには DDC Pak (.ddp) が付属しています。DDC Pak にはすべてのエンジン コンテンツの派生データが含まれているため、シェーダーなどをコンパイルせずに作業を開始できます。同様に、一部のサンプルは同じ理由で DDC Pak とともに出荷されます。
- Engine DDC Pak
- 例:EngineDir/DerivedDataCache/Compressed.ddp
- Project DDC Pak
- 例:ProjectDir/DerivedDataCache/Compressed.ddp
共有 DDC
同じ場所で作業するチームに対して最も強く推奨する方法の 1 つは、すべてのチーム メンバーとビルド マシンが読み書きできるネットワークドライブである共有 DDC をセットアップすることです。これにより、チーム全体で必要な DDC データの作成負荷が相殺されます。たとえば、アーティストがシェーダーを編集するとき、DDC データは DDC 共有に直接書き込まれます。
- 共有 DDC:ネットワークまたはマップされたドライブになります。
共有ドライブの例: \epicgames.net\root\DDC-Global-Fortnite
共有 DDC の使用
スタジオは、特定の場所にいるすべてのユーザーがアクセスできるな共有 DDC を使用する必要があります。そうすることで、派生したアセット フォーマットのビルドに必要なのは 1 人のみで、その後自動的にすべてのユーザー間で利用できるようになります。時には、アセットの処理が必要な時に遅延が生じる場合もありますが、結果は保存されて共有されます。かなり小さいチームの場合でも、アセット処理を共有するこの方法で作業すると処理時間のほとんどを除去できます。
DDC 全体をインターネット上へコピーすることは推奨しません。 DDC をバックアップ、またはバックアップから DDC を復元してください。これによる悪影響はありませんが、これは時間の浪費になります。DDC に保存されているデータ量を転送するのに、ローカルでゼロから生成するよりも時間がかかります。大きいプロジェクトでビルド済みの DDC データを配布する場合は、DDC Pak を生成する必要があります。
共有 DDC のセットアップ
BaseEngine.ini
で確認できるように、エディターにはすでに 3 つの方法のいずれかで有効にできる共有 DDC を使用するように設定されています。
ここでは、推奨される順にオプションを紹介します。
-
プロジェクトの DefaultEngine.ini に、チームの有効な場所へのパスを設定するオーバーライド (下図を参照) を追加します。
[DerivedDataBackendGraph] Shared=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, DeleteUnused=true, UnusedFileAge=10, FoldersToClean=10, MaxFileChecksPerSec=1, ConsiderSlowAt=70, PromptIfMissing=false, Path=\\YourCompanyServer\DDC, EnvPathOverride=UE-SharedDataCachePath, EditorOverrideSetting=SharedDerivedDataCache)
-
(下図のように)
UE-SharedDataCachePath
(Mac / LinuxではUE_SharedDataCachePath
) の環境変数を使用するフォルダーに設定します。 -
エディタで、
SharedDerivedDataCache
変数を設定します。
\YourCompanyServer\DDC; が書き込み可能である限り、エンジンが必要な構造体を作成するのでは特別なことをする必要はありません。
共有 DDC を無効にする
共有 DDC が構成されているプロジェクトでリモートで作業する場合、開発者は DDC データへのアクセスする方が生成よりも時間がかかるため、パフォーマンスが低下する可能性があります。共有 DCC を一時的に無効にするには、以下のいずれかの操作をします。
- コマンドラインで -ddc = noshared を渡します。
- ローカルのハードドライブに環境変数を設定します。
UE-SharedDataCachePath=None
- Macの場合:
UE_SharedDataCachePath = None
派生データのビルド
アセットをインポートするユーザーはエンジンでそのアセットを使用およびテストする可能性が高いため、派生データを作成するユーザーとなります。しかし、場合によっては新アセットの処理が必要になることがあります。これは必要に応じて自動的に発生し、高速のハードウェアで実行する場合に大きな影響を与えることはありませんが、時折ストールが発生する可能性があります。
以下のコマンドを実行して DDC をフィルすることができます。
UE4\Engine\Binaries\Win64\UE4Editor.exe ProjectName -run=DerivedDataCache -fill
DDC の事前準備を常に整えるため、この作業は毎夜行っていますが、一般的な自動キャッシュ機能で十分なため、これは必要ありません。
DDC フォルダをマウントする
内部ネットワーク上で DDC を使用するには、DDC を含むファイルをネットワークドライブにマウントする必要があります。この方法に慣れていない場合は、Windowsでのネットワークドライブの割り当て を参照してください。
DDC での配布
クックされたビルドは DDC を必要としないか、または使用しないため、クック処理はゲームのパッケージ化に推奨される方法です。
クックされたビルドは DDC を必要としないか、または使用しないため、クック処理はゲームのパッケージ化に推奨される方法です。
DDC のパッケージング
-
UE4/Engine/Binaries/Win64 ディレクトリから UE4Editor.exe を実行して、以下の引数を渡します。
UE4Editor.exe ProjectName -run=DerivedDataCache -fill -DDC=CreatePak
- これにより、UE4 \ ProjectName \ DerivedDataCache ディレクトリに DDC.ddp ファイルが作成されます。
- エンジンは .ddp ファイルを自動的に検出して使用します。
DDC 設定
DDC 設定はどこに保存されますか?
DDC 設定は、 [DerivedDataBackendGraph]
セクションの DefaultEngine.ini
に保持されます。デフォルトは「BaseEngine.ini」で確認できます。
[DerivedDataBackendGraph]
; Keep files for at least 7 days
MinimumDaysToKeepFile=7
; Configure the root entry.It uses a KeyLength node to hash long strings then passes requests to AsyncPut
Root=(Type=KeyLength, Length=120, Inner=AsyncPut)
; Configure the AsyncPut entry.It uses an AsyncPut node that then passes requests to Hierarchy
AsyncPut=(Type=AsyncPut, Inner=Hierarchy)
; Configure the hierarchy entry.This uses multiple nodes that are used in order until a read is found (writes go to all writable entries)
Hierarchy=(Type=Hierarchical, Inner=Boot, Inner=Pak, Inner=EnginePak, Inner=Local, Inner=Shared)
; Configure the Boot node.This holds 512MB of data used to speed up booting.
Boot=(Type=Boot, Filename="%GAMEDIR%DerivedDataCache/Boot.ddc", MaxCacheSize=512)
; Configure the local node.This is a filesystem node with the following set -
; Readonly:Can data be written to this layer
; Clean:Perform a cleanup of old files on launch
; Flush:Nuke the DDC and start over
; PurgeTransient:Don't keep transient data in the DDC
; DeleteUnused:Clean up old files (happens on a background thread)
; UnusedFileAge:Age after which files are removed
; FoldersToClean:Max number of folders to clean in a session. -1 = Unlimited
; MaxFileChecksPerSec:How many files to check a second.
; Path: path to use for the filesystem DDC
; EnvPathOverride:An environment variable that if set will be used instead of path.E.g.UE-LocalDataCachePath=d:\DDC. ('None' disables the DDC)
; CommandLineOverride:A command line argument used in preference to the default / envvar setting.E.g. -SharedDataCachePath=\\someshare\folder
; EditorOverrideSetting:Editor user setting that overrides the default/envvar/command line values
Local=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, PurgeTransient=true, DeleteUnused=true, UnusedFileAge=34, FoldersToClean=-1, Path=%ENGINEDIR%DerivedDataCache, EnvPathOverride=UE-LocalDataCachePath, EditorOverrideSetting=LocalDerivedDataCache)
; Configure the shared DDC that is accessed after local.It's a filesystem DDC and the parameters are explained above
Shared=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, DeleteUnused=true, UnusedFileAge=10, FoldersToClean=10, MaxFileChecksPerSec=1, Path=?EpicDDC, EnvPathOverride=UE-SharedDataCachePath, EditorOverrideSetting=SharedDerivedDataCache, CommandLineOverride=SharedDataCachePath)
; Configure an alternate shared DDC that is accessed after local.It's a filesystem DDC and the parameters are explained above
AltShared=(Type=FileSystem, ReadOnly=true, Clean=false, Flush=false, DeleteUnused=true, UnusedFileAge=23, FoldersToClean=10, MaxFileChecksPerSec=1, Path=?EpicDDC2, EnvPathOverride=UE-SharedDataCachePath2)
; Configure a Project Pak node.This is a pre-generated DDC data file for the project that can be distributed to reduce runtime fetches/generation
; See documentation for how to create a DDP via the DerivedDataCache commandlet
Pak=(Type=ReadPak, Filename="%GAMEDIR%DerivedDataCache/DDC.ddp")
; Configure a Project Pak node.This is a pre-generated DDC data file for the engine that can be distributed to reduce runtime fetches/generation
EnginePak=(Type=ReadPak, Filename=%ENGINEDIR%DerivedDataCache/DDC.ddp)
よくある質問
Q:複数の DDC 設定を使用できますか?
できます。 DefaultEngine.ini
に新しい [YourDDCSettings] エントリを作成し、 -ddc = YourDDCSettings.
でエディターを実行します。
Epic では、これを 3 つの理由で行っています。
- グローバルではなく独自の DDC を使用したいオフィスのチーム向け。
- DDC Pak を作成するとき、
[CreateInstalledEnginePak] .
など、.pak ファイルへの入力を制御するオプションのうちの 1 つを使用します。 - インターネットの速度が遅い、または VPN が有効にできないために共有 DDC を使用したくない在宅勤務者向け。
上記の 3 で使用される NoShared ( -ddc = NoShared
) を含め、 BaseEngine.ini
にはデフォルトでいくつかの DDC エントリが含まれていることがわかります。
Q:ディスク容量が足りません。ローカル DDC を他の場所に移動できますか?
できます。 環境設定のプロジェクトで調節できます。さらに、「UE-LocalDataCachePath」の環境変数を選択したパスに設定するだけです。例: UE-LocalDataCachePath = d:\ DDC.
- コマンド プロンプトで、「setx UE-LocalDataCachePath d:\DDC」と入力します。
- Unreal Engine を、Epic Launcher、UGS、Visual Studio などの起動元のプリケーションとともに再起動します。
これは、プライマリドライブのスペースが不足している場合、または複数のブランチで作業していて、データが重複しないようにする場合に使用できます。
Q:ネットワーク接続が遅いです。共有 DDC をオフにできますか?
できます。 一時的にオフにするか、または永続的にオフにするかによって、2 つのオプションがあります。
- DDC の環境変数を「なし」に設定すると、無効になります。この場合、
UE-SharedDataCachePath=None
を設定します。 -ddc = noshared.
でエディターを起動します。
Q:共有 DDC パスを変更できますか?
できます。 上記の UE-SharedDataCachePath
を設定すれば変更することができます。
ただし、UE-SharedDataCachePath
をローカルパスに設定しないでください。これを行うと、ローカルキャッシュと共有キャッシュの両方がマシンに存在することになり、ディスク スペースが 2 倍になり、ゲインはゼロになります。
Q:DDC の問題をどのように診断できますか?
エディタが DDC データを正しく読み取っていないと思われる場合は、ログファイルで「LogDerivedDataCache
」を検索してください。
LogDerivedDataCache:Display:Max Cache Size:512 MB
LogDerivedDataCache:Loaded boot cache 0.07s 118MB ../../../EngineTest/DerivedDataCache/Boot.ddc.
LogDerivedDataCache:Display:Loaded Boot cache: ../../../EngineTest/DerivedDataCache/Boot.ddc
LogDerivedDataCache:FDerivedDataBackendGraph:Pak pak cache file ../../../EngineTest/DerivedDataCache/DDC.ddp not found, will not use a pak cache.
LogDerivedDataCache:Unable to find inner node Pak for hierarchical cache Hierarchy.
LogDerivedDataCache:FDerivedDataBackendGraph:EnginePak pak cache file ../../../Engine/DerivedDataCache/DDC.ddp not found, will not use a pak cache.
LogDerivedDataCache:Unable to find inner node EnginePak for hierarchical cache Hierarchy.
LogDerivedDataCache:Found environment variable UE-LocalDataCachePath=d:\DDC
LogDerivedDataCache:Using Local data cache path d:\DDC:Writable
LogDerivedDataCache:Using Shared data cache path \\epicgames.net\root\DDC-Global-UE4:Writable
以下のことが分かります。
- プロジェクトまたは Engine Pak キャッシュはありません。これは、Perforce からこのビルドをコンパイルしたときに期待されるものです。
- ローカルデータ キャッシュパスは d:\ DDC にマップされ、書き込み可能です。
- 書き込み可能な Epic 共有キャッシュを使用しています。
-logcmds ="LogDerivedDataCache Verbose"
で実行して、詳細なログを有効にすることもできます。
Q:S3 DDC とは何ですか?
Fortnite DDC は、コンテンツ量が原因で非常に大きくなっています。コロナ禍において、これらのすべてのデータをネットワーク共有から VPN の限られた帯域幅を通してオフィスにプルするのは非常に非効率的であることに開発者達はすぐに気づきました。
エンジンを S3DDC を使用する設定にするのは非常に簡単ですが、DDC コンテンツの生成と S3 へのアップロードを自動化に設定する必要があります。
Q:IDDCUtilsModuleInterface とは何ですか?
このインターフェイスは使用することができますか?プラットフォームまたはドメインに基づいて実行時に動的に解決できる DDC 設定の引数を指定してください。
残念ながら、これに対する例はありませんが、簡単に実装できます。
#include "CoreMinimal.h"
#include "DerivedDataUtilsInterface.h"
#include "Modules/ModuleManager.h"
class FDCCUtilsModule : public IDDCUtilsModuleInterface
{
/** IDDCUtilsModuleInterface implementation */
virtual FString GetSharedCachePath(const FString& CacheName) override;
/** IModuleInterface implementation */
virtual void StartupModule() override;
/** List of internal DDC servers */
TMap<FString, FString> NameToServerMap;
}
IMPLEMENT_MODULE(FDDCUtilsModule, DDCUtils)
void FDDCUtilsModule::StartupModule()
{
#if PLATFORM_MAC
NameToServerMap.Add(TEXT("?EpicDDC"), TEXT("/Volumes/UE4DDC"));
NameToServerMap.Add(TEXT("?EpicDDC2"), TEXT("/Volumes/UE4DDC2"));
NameToServerMap.Add(TEXT("?EpicSeaDDC"), TEXT("/Volumes/DDC"));
#elif PLATFORM_LINUX
NameToServerMap.Add(TEXT("?EpicDDC"), TEXT("/mnt/UE4DDC"));
NameToServerMap.Add(TEXT("?EpicDDC2"), TEXT("/mnt/UE4DDC2"));
NameToServerMap.Add(TEXT("?EpicSeaDDC"), TEXT("/mnt/DDC"));
#else
NameToServerMap.Add(TEXT("?EpicDDC"), TEXT("\\\\epicgames.net\\root\\DDC-Global-UE4"));
NameToServerMap.Add(TEXT("?EpicDDC2"), TEXT("\\\\epicgames.net\\root\\UE4DDC2"));
NameToServerMap.Add(TEXT("?EpicSeaDDC"), TEXT("\\\\sea.epicgames.net\\root\\DDC"));
#endif
}
FString FDDCUtilsModule::GetSharedCachePath(const FString& CacheName)
{
FString* ServerName = NameToServerMap.Find(CacheName);
if (ServerName)
{
return *ServerName;
}
else
{
return FString();
}
}
Q:DDC Pak はどのように作成するのですか?
プロジェクト固有の DDC を作成する方法:
UE4Editor.exe ProjectName -run=DerivedDataCache -fill -DDC=CreatePak
このコマンドレットは、プロジェクトのすべてのコンテンツの DDC を作成します。または、自動化またはユーザーセッションの実行中に -DDC = CreatePak を指定するだけで、ターゲットをさらに絞ったコンテンツのセットを生成できます。
エンジン DDC を作成する方法:
UE4Editor.exe -run=DerivedDataCache -fill -DDC=CreatePak