プロジェクトの規模が拡大して、開発の最終段階に到達したときには、アセットのサイズと数量がいずれも増加していることがよくあります。これにより次のような共通課題が生じます。
-
ソース コントロールから大規模プロジェクトを同期すると、すべてのデベロッパー側で大幅に時間がかかるようになります。新規ワークスペースを同期するために、高い機会費用が生じることになります。
-
大規模プロジェクトでは個別のデベロッパーの環境で大容量のハード ドライブ スペースを使用します。
-
インターネット接続の速度が遅い環境のメンバーは、大規模ファイルを頻繁に転送するため、他のチーム メンバーよりも同期に時間がかかります。
-
ソース コントロール システムでは頻繁に重複作業が発生し、同一ファイルの複数コピーを配布することになります。
仮想アセット により、プロジェクトのサイズが拡大した場合に、チームの全メンバー間でデータを高速に効率的に同期できるようになります。仮想アセット システムの主な目的は、エディタの大量データをコア アセット メタデータから分離して格納することにより、プロジェクトのディスク容量要件を抑えることにあります。
このガイドでは、仮想アセットの仕組みとプロジェクトの使用方法の概要について説明します。
仮想アセットの仕組み
アセット で作業するとき、ユーザーに必要なのは、エディタで表示するための最小限のアセット情報だけです。たとえば テクスチャ に必要なのは、コンテンツ ブラウザで表示するため、サムネイル画像とエディタ プロパティ (座標やスケールなど) だけです。それ以外には、テクスチャ用の .uasset
ファイルの大部分はピクセル データであり、ロードするためにユーザーが呼びだすことはないものです。
仮想アセットではこの情報を次のとおり 2 つの部分に分離します。
-
コア アセット メタデータ - ソース コントロールのアセットがある場所にある部分。
-
バルク データ – アセットのデータの主要部分で、ソース コントロール内の分離された場所にある共有の 派生データ キャッシュ (DDC) に保持されます。
これにより、ソース コントロールと対象プロジェクトを同期するときに、コア アセット データのみを同期することができます。作業マシンにある場合と変わらずにアセットをブラウズし、必要なときにアセットを選択して、そのバルク データを同期してロードすることができます。仮想アセットでは異なる機能の開発ブランチもサポートします。これにより安定して動作するまで他のチーム メンバーに影響を及ぼすことなく、実験段階の機能を開発することができます。
仮想アセットのメリット
仮想アセットには次のようなメリットがあります。データ使用量が増大する大規模プロジェクトで特に顕著ですが、あらゆる規模のプロジェクトにメリットがあります。
プロジェクトを以前より短時間で同期
個々のコントリビューターは、必要なときにファイルのバルク データを同期するだけです。使用するのはごくわずかなデータです。メリットがあるのは高速接続でのアクセスを利用できない場合で、プロジェクトをロードするのに必要な同期時間を削減します。特に役に立つのは、大量のバックログのアセットがあるライブ サービス ゲームの場合です。
格納データの削減
バルク データは主にソース コントロールあるいは一元管理の場所の派生データ キャッシュにあり、個別のデベロッパーのハード ドライブにはありません。つまりプロジェクトでは、チーム メンバーのハード ドライブ スペースの使用量が減ります。この節約量はプロジェクトにあるアセットのタイプで決まりますが、一般にハード ドライブの使用量が 5 分の 1 以下に減ります。
重複を削除
プロジェクトに複数のワークスペースがある場合、同一ファイルが多数複製されることになります。仮想アセットと共有 DDC を使用する場合、これらのファイルの重複が排除され、個人のユーザー マシンでの使用量がさらに削減されます。
仮想アセットの要件
仮想アセットをプロジェクトで使用するには、次の要件を満たす必要があります。
ソース コントロール
仮想アセットを使用するには、プロジェクトを Perforce に統合する必要があります。Unreal Editor のチェックイン ワークフローも使用することを推奨します。これによりチェックインしたときにファイルが必ず「仮想化」されます。
共有 DDC (任意)
派生データ キャッシュ (DDC) の使用は、仮想アセットを使用するうえで必須ではありませんが、これを推奨するのは Perforce にアクセスするときのパフォーマンスが向上するためです。DDC バックエンドはキャッシュ ストレージのみとして使用されます。DDC は永続的なストレージとして使用するのに一般的には安全ではないからです。
インターネット接続性
仮想アセットは、信頼性がある高速接続で共有データ キャッシュにユーザーがアクセスできる場合にうまく機能します。そうではない場合、はっきりとしたヒッチ (処理落ち) が発生することがあるため、容量をすべて事前に用意して同期の時間を確保したほうがよいかもしれません。
さらに仮想アセットには「オフライン作業」モードはありません。つまり、インターネット接続が切断している間に作業するユーザーが存在する場合、要求したときに仮想アセットのバルク データを取り出せないということです。エディタがクラッシュすることはありませんが、再接続して必要なバルク データを取得する必要があります。
仮想アセットのデプロイ方法
仮想アセットは現時点でベータ機能であり、デフォルトでは無効になっています。次のプロパティをプロジェクトの「DefaultEngine.ini
」ファイルに追加して、有効にできます。
[Core.ContentVirtualization]
SystemName=Default
[Core.VirtualizationModule]
BackendGraph=VABackendGraph_Example
[VABackendGraph_Example]
PersistentStorageHierarchy=(Entry=SourceControlCache)
CacheStorageHierarchy=(Entry=DDCCache)
SourceControlCache=(Type=p4SourceControl, DepotRoot="...")
DDCCache=(Type=DDCBackend)
これらの設定により、現在サポートされているすべてのアセットの仮想化が有効になります。この時点から、リポジトリにコミットしたどのアセットも、自動で仮想化されます。仮想化されたペイロードが格納されるのは、プロジェクトの「Saved」ディレクトリの「VirtualizedPayloads」サブディレクトリです。
パッケージが仮想化されているかを確認するには、コンテンツ ブラウザでアセットにカーソルを乗せます。ツールチップの [Has Virtualized Data (仮想化データを含む)] が true
である場合、アセットは仮想アセット システムで正常に変換されています。

仮想アセットの設定方法 (前に示したコンフィグ ファイルを含む) の詳細については、「仮想アセット クイックスタート ガイド」を参照してください。
ターゲット ファイルを手動で設定する方法
ファイルを変更しないでアセットを仮想化する場合、Unreal Virtualization Tool を使用して変換します。Unreal Virtualization Tool のソース コードは「Engine\Source\Programs\UnrealVirtualizationTool\
」にあります。Unreal Virtualization Tool をコンパイルしてから、次の引数を指定してコマンドラインで実行します。
-ClientSpecName=[Workspace Name] -Mode=Changelist -Changelist=[Changelist Number]
-
ClientSpecName: 送信元のワークスペースの名前。
-
Changelist: 仮想化して送信を行うチェンジリスト。
ターゲットのチェンジリストに含まれるすべてのファイルは仮想アセットを使用して変換され、サブミットされます。
プロジェクトのバックエンドを定義する
バックエンド グラフ では、プロジェクトのバックエンドで仮想アセットを Unreal Engine により格納する場所を定義します。主に次の 2 つのリストで定義されます。
-
CacheStorageHierarchy: 取得処理をスピードアップするために使用する高速バックエンド。これらのバックエンドでペイロードが見つかることが理想ですが、重要ではありません。
-
PersistentStorageHierarchy: 低速であるが信頼性に優れたバックエンド。永続的なストレージでファイルが必ず見つかるようにする必要があります。
デベロッパーがペイロードを取得するとき、システムはまずバックエンドの CacheStorageHierarchy を探し、バックエンドの一つで要求データが見つからない場合は PersistentStorageHierarchy にフォールバックします。どちらのリストにも複数のバックエンド エントリがある場合、システムはリストどおりの順で処理するため、高速から低速の順でリストに記載する必要があります。通常、CacheStorageHierarchy には共有 DDC が含まれ、PersistentStorageHierarchy ではソース コントロール システムを参照します。
バックエンド グラフは、仮想アセット用の他のコンフィグ変数とともに「DefaultEngine.ini
」ファイルで定義できます。プレースホルダー名を使用したバックエンド グラフの例を以下に示します。
[VABackendGraph_Example]
PersistentStorageHierarchy=(Entry=SourceControlCache)
CacheStorageHierarchy=(Entry=DDCCache)
SourceControlCache=(Type=p4SourceControl, DepotRoot="...")
DDCCache=(Type=DDCBackend)
バックエンド グラフをターゲットに設定するには、[Core.ContentVirtualization]
にある BackendGraph
変数を、使用するバックエンド グラフの名前に設定します。
BackendGraph=VABackendGraph_FileSystem
バックエンド グラフの作成方法の詳細については、「バーチャル アセットのバックエンド グラフ」ページを参照してください。
仮想アセットのガイドライン
次のセクションでは、仮想アセットをプロジェクトに組み込む方法の推奨事項を示します。
アセットの仮想化方法
新しいプロジェクトを開始する場合、最初から仮想アセットを使用することをお勧めします。これにより、仮想アセットを後から追加した場合に発生する可能性がある問題に遭遇することなく、パフォーマンス上のあらゆるメリットをチームが享受でき、スムーズな開発エクスペリエンスが実現します。
仮想アセットを既存のプロジェクトに追加する場合、このサポートを追加する方法として、手動、一括、定期のどれを使用するのかを検討する必要があります。どのアプローチが対象プロジェクトに適しているのかは、そのスコープとプロダクション タイムラインで決まります。
一括の仮想化
一度にプロジェクト全体を仮想化する方法では最短時間で最高の同期パフォーマンスが得られますが、プロジェクトの規模が大きくなるほどリスクも高くなります。切り替えを可能にするために、すべてのバイナリ コンテンツをチェックインする必要があります。さらに、プロジェクトのバルク データ全体は、一度に共有 DDC にプッシュされて、セキュリティ リスクが高まります。これにより、特に大規模プロジェクトのプロダクションにおける最終段階で実行不能になるような重大な障害がプロジェクトで発生する可能性があります。
バッチでの仮想化
障害を避けるには、スクリプトを使用して、チェンジリストの事前設定セットとともに Unreal Virtualization Tool を定期的に実行し、実質的にアセットをバッチごとに仮想化します。これにより各段階で異なるチーム/機能に対応でき、その一方で最終的に仮想アセットの使用を全体に拡げられます。
手動の仮想化
特定フォルダだけを仮想化することにより、共有 DCC に入るバルク データがどのアセットのものかを細かく制御できます。各ステージでの仮想アセットのロールアウトも簡単になります。ただし、同期パフォーマンスを向上できるのは、直接的にフォーカスしている機能またはフォルダのみです。
プロジェクトへの影響を最小限に抑えて最大のメリットを短期間で得るには、プロジェクトにある最も大きなアセットをターゲットに設定します。長い間変更していないアセットでも安全にターゲットとして設定できます。
仮想アセットのメリットをチーム全体で確実に享受するには、チーム メンバーがそれぞれ担当するファイルを保存したときにアセットを仮想化します。チームでアクティブに作業していないアセットは対象になりませんが、時間の経過とともに着実に仮想アセットが導入されます。
ガイドラインのまとめ
-
新しいプロジェクトを開始する場合、最初から仮想アセットを使用することをお勧めします。
-
プロジェクトがプロダクションの中間または最終段階にある場合、イテレーションが多いコンテンツには仮想アセットを導入しないことをお勧めします。プロジェクトで障害が発生する可能性があるためです。ただし、チームで長い間変更していないアセットは安全に仮想化できます。
-
仮想アセットに切り替えることによる、プロジェクトの安定性への影響を抑えながらそのメリットを得るには、プロジェクトの最大アセットのみをターゲットに設定します。
仮想アセットの注意事項
仮想アセットにはメリットがありますが、場合によってはプロジェクトが複雑になり、効率的ではなくなることがあります。
追加のデータ検証
ユーザーがアセットをサブミットする際は、プライマリ メタデータを変更しただけのときでも、アセットのバルク データをコミットする必要があります。コミットはエディタから強制的に実行することができ、これによってキャッシュからデータをフェッチできます。
ネットワークとアセットの使用方法
ユーザーのネットワーク接続に関連する以下の要因により、仮想アセット システムの効果が低下することがあります。
-
DCC への低速のネットワーク接続。
-
DDC へのアクセスが不能。
-
同様のアセットを使用するメンバーがごく少数。
上記のいずれかに該当する場合、バルク データの取得には非常に時間がかかるようになる可能性があります (ユーザーがほとんどまたはすべてのアセットをローカルでコンパイルしてクックできるほどの時間)。この場合は同量のディスク容量が使用され、アップフロントで同期するだけで多くの時間がかかることがあります。
プライマリ データの分割
仮想化により、別に格納される 2 つの構成要素にプライマリ データが分割されます。これにより、仮想化されていないデータよりも移植性が下がり、プロジェクトのデモをシッピングする際には複雑さが増します。