---
title: [Tokyo DevDays  26&#039;] 開発効率化のための Zen 利用ベストプラクティス
tags:  #ue5 #devdays  
author: [エピック ゲームズ ジャパン](https://image.docswell.com/user/EpicGamesJapan)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/VJPK1Z8LE8.jpg?width=480
description: 2026年8月26日に開催されました「Unreal Engine Tokyo Dev Days 26&#039;」イベントの「開発効率化のための Zen 利用ベストプラクティス」講演のスライドです。
published: August 31, 26
canonical: https://image.docswell.com/s/EpicGamesJapan/527E71-DevDays26-Zen
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/VJPK1Z8LE8.jpg)

開発効率化のための
Zen 利⽤ベストプラクティス
Epic Games Japan
Lead Software Engineer, Developer Relations
鍬農 健⼆郎
Last update: Aug 26, 2026


# Page. 2

![Page Image](https://bcdn.docswell.com/page/2EVVYWN6EQ.jpg)

UE5 から追加されたZenシリーズ
禅 /Zen/zen/[noun] : fundamentals; essentials; harmony;
完全に再設計されたアーキテクチャにより、アセットのクック、保
存、ロードを⾼速かつ効率的に⾏うことができる
エレガントで調和の取れた流れが、待ち時間や中断を最⼩限に抑
えて仕事をするスペースを提供し、落ち着いた時間を過ごすこと
ができる（ようなイメージ）


# Page. 3

![Page Image](https://bcdn.docswell.com/page/57GL9DK2EL.jpg)

よくわからない
●
●
●
そもそも現在動いているのか...？
なんとなく使っているけど有効活⽤できているか...？
意図して使っているけど他のアプローチはあるか...？


# Page. 4

![Page Image](https://bcdn.docswell.com/page/4EQYW1N9JP.jpg)

Zen が解決するのは開発イテレーション
開発の待ち時間は次の3つ
DDC
Cook
Deploy
シェーダ‧メッシュ等
のキャッシュ再⽣成待ち
アセットのコンバート
成果物の受け渡し待ち
パッケージ作成
コンテンツのコピー待ち
Zen
これらの作業を効率化するサービス


# Page. 5

![Page Image](https://bcdn.docswell.com/page/KJ4WKR3R71.jpg)

Zen DDC
Agenda
Zen Cook
Zen Streaming
まとめ


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LE1YXQ1V7G.jpg)

Chapter 1
Zen DDC


# Page. 7

![Page Image](https://bcdn.docswell.com/page/GEWGNM83J2.jpg)

DDC (従来の運用) の基本
●
●
DDC (Derived Data Cache) = 派⽣データをキャッシュし、次回以降で⾼速に起動
派⽣データの例: プラットフォーム別テクスチャ圧縮、コンパイル済みシェーダ、
変換済みメッシュ/オーディオ、Nanite/Lumenビルド結果
ローカルPC
データ要求
ヒット：返却
ミス：⽣成‧保存
エディタ
Local DDC


# Page. 8

![Page Image](https://bcdn.docswell.com/page/47ZL3Q8GJ3.jpg)

DDC (従来の運⽤) の派⽣
●
様々な種類のDDC
○ Local DDC
: ⾃機のキャッシュ
○ Shared DDC : 同⼀オフィス内などのチームで共有
○ Cloud DDC
: Shared DDC よりも広い範囲 (広域‧組織横断のDDC)
オフィスPC
ローカルPC
Shared DDC
チームの作業者
クラウドVM
Local DDC
エディタ
Cloud DDC
リモート作業者


# Page. 9

![Page Image](https://bcdn.docswell.com/page/YJ6WX6PQJV.jpg)

Zen DDC (現在の運⽤) の基本
●
●
Zen DDC = 派⽣データを Zen Server がキャッシュし、次回以降で⾼速に起動
「⼤量の⼩さなファイル」から「常駐アプリが管理するデータベース」に置き換え
ローカルPC
DDC
エディタ
ローカルPC
ZenDDC
エディタ


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GJ5MX6K2J4.jpg)

Zen DDC (現在の運⽤) の派⽣
●
様々な種類のZen DDC
○ Zen Local
: Zen Server による⾃機のキャッシュ
○ Zen Shared : Zen Server による同⼀オフィス内などのチームで共有
オフィスPC
ローカルPC
Zen Shared
チームの作業者
クラウドVM
Zen Local
エディタ
Cloud DDC
リモート作業者


# Page. 11

![Page Image](https://bcdn.docswell.com/page/9E29XMW17R.jpg)

Zen DDC の有効化
●
Zen Local：UE5.8ではデフォルト有効
BaseEngine.ini
[Zen]
AutoLaunch=true
●
Zen Shared：追加でホストの設定が必要
BaseEngine.ini
[StorageServers]
Shared=(Host=None, Namespace=&quot;prj.ddc&quot;, EnvHostOverride=UE-ZenSharedDataCacheHost,
CommandLineHostOverride=ZenSharedDataCacheHost, DeactivateAt=60)


# Page. 12

![Page Image](https://bcdn.docswell.com/page/D7Y48XL4EM.jpg)

例1: オフィスにあるビルドマシンに Zen Shared を配置
DefaultEngine.ini
Shared=(Host=&quot;http://office-zen.example.local:8558&quot;,
例２：クラウド上に複数（2拠点, レイテンシが良い1台を利⽤） Zen Shared を配置
DefaultEngine.ini
Shared=(Host=&quot;http://tokyo.example.com:8558;http://virginia.example.com:8558&quot;,
実際に使われる優先度は、
●
●
●
.iniファイル
環境変数
コマンドライン
: Host=&quot;http://oﬃce-zen.example.local:8558&quot;
: UE-ZenSharedDataCacheHost=&quot;10.7.101.1:8558&quot;
: -ZenSharedDataCacheHost=None
リモート作業者や接続不安定時はZenSharedを”None”で切り離すことも


# Page. 13

![Page Image](https://bcdn.docswell.com/page/VENYQ146J8.jpg)

Zen DDC と DDC はどう違う？
ボトルネックだった「ファイルシステム‧メタデータ操作」を排除し、通信をバッチ化
DDC (ファイル群)
ZenDDC (バッチ+DB)
OSメタデータ操作(1リクエスト=1ファイル)が集中
バッチRPC、DB化でメタデータ定義を回避
リクエスト
.udd #1
open/stat/close
リクエスト×8
既定バッチ
.udd #2
open/stat/close
.udd #3
open/stat/close
.udd #4
open/stat/close
※ CID: Content ID, キャッシュの実データ
Zen Server
Record+CID Store


# Page. 14

![Page Image](https://bcdn.docswell.com/page/Y79PD5QRE3.jpg)

Zen DDC が保有するキャッシュデータ
共通の論理モデル→Zenの物理配置
FCacheKey
Zen Server 内部
Bucket+Hash
Record Store
FCacheRecord
保存
Key→Record参照
CID Store
複数Value+Meta
内容アドレス
Tiny/Small/Large
圧縮バッファ
Hits/Miss/Writes
変わらない
変わった: 保存形式
Legacy: .uddファイル
Zen: Record Store + CID Store


# Page. 15

![Page Image](https://bcdn.docswell.com/page/G78D3YGG7D.jpg)

Zen DDC キャッシュ共有の仕組み
エディタ
Zen Local
派⽣データ要求
Engine Pak
Local DDC
Project Pak
Zen Shared
Shared DDC
Cloud DDC
Engine\Conﬁg\BaseEngine.ini
[DerivedDataCacheGraphs]
Default=(ProjectPak, EnginePak, ZenLocal, Local, ZenShared, Shared, Cloud)


# Page. 16

![Page Image](https://bcdn.docswell.com/page/L7LMV4GXJR.jpg)

Zen DDC キャッシュ共有の仕組み - Get (読み取り)
Miss
エディタ
派⽣データ要求
Zen Local
Get
Get
Miss
Miss
Get
Engine Pak
Get
Miss
Get
Project Pak
Local DDC
Hit
Get
Zen Shared
Shared DDC
Cloud DDC
順番に Get し、Miss したら Hit するまで次の層へ


# Page. 17

![Page Image](https://bcdn.docswell.com/page/4EMYGKQ3EW.jpg)

Zen DDC キャッシュ共有の仕組み - Put (書き込み)
エディタ
派⽣データ要求
Put
Zen Local
Engine Pak
Put
Local DDC
Project Pak
Put
Zen Shared
Put
Shared DDC
Put
Cloud DDC
Put
書き込み可能な層へ同時 Put


# Page. 18

![Page Image](https://bcdn.docswell.com/page/PER9ZX8RJ9.jpg)

Zen DDC の効果
試⾏
エディタ起動
Map オープン
PIE
DDC 初回起動
1m21s
2m14s
20m46s
DDC 2回⽬起動
17s
26s
1m18s
試⾏
エディタ起動
Map オープン
PIE
ZenDDC 初回起動
1m43s
2m26s
22m6s
ZenDDC 2回⽬起動
15s
26s
54s
計測条件
効果
Unreal Engine: UE5.8.1
Project: CitySample
CPU: AMD Ryzen Threadripper PRO 3995WX 64-Cores
GPU: NVIDIA GeForce RTX 3080
DRAM: 256GB DDR4
Disk: AMD-RAID Array2 SCSI Disk Device
DDC vs ZenDDC 単体では差が殆どない


# Page. 19

![Page Image](https://bcdn.docswell.com/page/P7XQ968YEX.jpg)

DDC と⽐較して Zen DDC の効果は？
効果が薄いケース
●
既定では DDC/Zen の両⽅に書く
効果があるケース
●
既定設定時は ZenDDC(Zen)+DDC(File System)へ
の書き込みの⼆重作業
●
初回起動の時間は DDC ではなくシェーダ
コンパイルの割合が⼤きい
殆どはシェーダコンパイル、テクスチャ圧縮、
Nanite/VSM/ Distance Field ビルド
●
DDC 取得が全体の⼀部しか占めていない
2回⽬の DDC 読み取りは OS ページキャッシュに
乗っており実質メモリアクセス
チームの 共有場所がネットワークフォルダ
DDCは各 Editor が共有フォルダを直接開くが、
Zen Shared はHTTP でまとめて要求
●
⼩さなキャッシュの照会が多数ある
リクエスト数がまとめて要求されるため、照会数
が多いほど効果的
●
複数箇所からのリクエストが同時発⽣時
Zen Shared がキャッシュを⼀元管理しているた
め、効率的に処理


# Page. 20

![Page Image](https://bcdn.docswell.com/page/37K9P1K47D.jpg)

CI で Zen DDC の充填
Zen DDC を効率的に利⽤するための⽅針
●
●
●
●
●
CIで夜間に Zen Shared を充填するのが最も費⽤対効果が⾼い
DDCコマンドレットを全プラットフォーム分回してZenShared に書き込み
夜間定期 + エンジンアップグレードやシェーダバージョン更新の直後
開発者は読み取り専⽤、CI のみ書き込み、という構成も環境変数で可能
健全かどうかは、DDC.Summary の ZenRemoteGetHitPct を収集して確認


# Page. 21

![Page Image](https://bcdn.docswell.com/page/LJ3WXQZDJ5.jpg)

Zen Shared の キャッシュを充填
Engine\Binaries\Win64\UnrealEditor-Cmd.exe ^
D:\Proj\MyGame\MyGame.uproject ^
-run=DerivedDataCache ^
-fill ^
-TargetPlatform=Windows ^
-unattended ^
-nop4
ZenRemoteGetHitPct を CI で収集
Engine\Build\BatchFiles\RunUAT.bat BuildCookRun ^
-project=D:\Proj\MyGame\MyGame.uproject ^
-platform=Windows -clientconfig=Development ^
-cook -zenstore -skipstage -nop4 -unattended -buildmachine ^
-AdditionalCookerOptions=&quot;-CookStatsFile=D:\Temp\cookstats.json&quot;


# Page. 22

![Page Image](https://bcdn.docswell.com/page/8JDK29R2EG.jpg)

Zen DDC のベストプラクティス - Zen Local
●
Zen Local のデータパスを⾼速SSDに設定
○ クラウド同期フォルダ‧ネットワークドライブは厳禁
○ 空き容量を常時確保しておく、最低でも100GB程度は望ましい
○ Engine.ini の DataPath でパス指定可能
■ LocalDDCPath / ProjectLocalDDCPath で指定時はそちら優先
DefaultEngine.ini
[Zen.AutoLaunch]
DataPath=C:\DDC\Zen


# Page. 23

![Page Image](https://bcdn.docswell.com/page/VEPK1ZWL78.jpg)

Zen DDC のベストプラクティス - Zen Shared
●
Zen Shared ホスト設定を.iniで配布するだけ、必要があれば以下を調整
○ Zen Server は「データを定期削除」「接続が遅い場合は⾃動で無効化」
■
■
■
■
--gc-cache-duration-seconds 1209600
--gc-interval-seconds 21600
--gc-low-diskspace-threshold 2147483648
DeactivateAt=60
: 14⽇経過で削除
: 6時間毎に削除
: 空き2GBで強制削除
: 遅延閾値(ms)超過で接続無効化
DefaultEngine.ini
[Zen.AutoLaunch]
ExtraArgs=--http asio --gc-cache-duration-seconds 1209600 --gc-interval-seconds 21600
--gc-low-diskspace-threshold 2147483648 --cache-bucket-limit-overwrites --quiet
--restrict-content-types --allow-external-oidctoken-exe=false
[StorageServers]
Shared=(Host=”10.7.101.1:8558”, Namespace=&quot;ue.ddc&quot;,
EnvHostOverride=UE-ZenSharedDataCacheHost,
CommandLineHostOverride=ZenSharedDataCacheHost, DeactivateAt=60)


# Page. 24

![Page Image](https://bcdn.docswell.com/page/27VVYW867Q.jpg)

Zen DDC のベストプラクティス - 健全化
指標の⽬安
良好
要調査
ZenLocal の Hit%
95%以上
80%未満
ZenLocal/Zen Sharedの Latency
1ms未満 / 20ms以下
10ms超 / 60ms超
File System の Write (FS未使⽤時)
0
0以上


# Page. 25

![Page Image](https://bcdn.docswell.com/page/5JGL9D527L.jpg)

Chapter 2
Zen Cook


# Page. 26

![Page Image](https://bcdn.docswell.com/page/47QYW1Z9EP.jpg)

Cook (従来の運⽤) の基本
●
●
Cookの基本処理は、依存アセットの検索‧オープン‧保存の繰り返し
出⼒先はディスク上で、出⼒は Loose Files (.uasset/.uexp/.ubulk)
Cooker
ディスク
パッケージ毎に1-3を繰り返し
Loose Files を保存
1.検索
2.ロード
3. 保存
依存関係を辿る
UPackageロード
ファイル書き出し
Commit
以降⼯程は、このディスク上のファイルを前提にする
Package→Deploy→Launch では⼤量のLoose Files をコピー‧再配置
.uasset
.uasset
.uasset
.uasset


# Page. 27

![Page Image](https://bcdn.docswell.com/page/KE4WKRDRJ1.jpg)

Zen Cook (現在の運⽤) の基本
●
●
●
基本的な Cook 処理は同じ
出⼒先は Zen Server で、出⼒は Oplog (Cook済みアセット情報)
ディスク上に ue.projectstore (接続情報を持つ.jsonファイル)
Cooker
Zen Server
パッケージ毎に1-3を繰り返し
Oplog を保存
1.検索
2.ロード
3. 保存
依存関係を辿る
UPackageロード
ファイル書き出し
Commit
ディスク
Project Store を保存
.json
以降⼯程は、このディスク上のファイルを前提にする
Package は Oplog から コンテナファイルを作成、Zen Streaming は実機が HTTP でチャンクを取得


# Page. 28

![Page Image](https://bcdn.docswell.com/page/L71YXQZVJG.jpg)

Oplog (operation log) とは
Zen Server
Oplog を保存
●
●
●
●
●
Zen Server が持つ ”Cook済みアセットの格納庫”
で実質ここに「Cook済みデータ」がある
「1 uasset = 1ファイル」ではなく「IoStore 向け
に分解されたチャンク」として保存
パッケージ単位で載るもの
○ PackageData：本体チャンク
○ BulkData：.ubulk 等
○ 追加ファイル情報
○ PackageHashes：増分判定‧整合性
○ その他...
Incremental Cook‧Snapshot の⼟台
Editor の View Store から閲覧可


# Page. 29

![Page Image](https://bcdn.docswell.com/page/G7WGNM93E2.jpg)

Project Store とは
Zen Server
Oplog を保存
●
●
●
●
Oplog の参照先情報を格納した JSON ファイル
Oplog が本体、ue.projectstore は案内図
実機や Package は Project Store を読んで、どの
zenserver のどの Oplog を開くかを決める
Cook 開始時に作成、Cooked/StagedBuilds に保存
Disk
ue.projectstore を保存
ue.pr
ojects
tore


# Page. 30

![Page Image](https://bcdn.docswell.com/page/4JZL3Q9GE3.jpg)

Zen Cook の有効化
●
プロジェクト設定 (UE5.8からデフォルト有効)
BaseGame.ini
[/Script/UnrealEd.ProjectPackagingSettings]
bUseIoStore=True
bUseZenStore=True
●
コマンドライン/UAT
-ZenStore (無効化時は -SkipZenStore)


# Page. 31

![Page Image](https://bcdn.docswell.com/page/YE6WX6KQEV.jpg)

Zen Cook の効果
Cook出⼒
試⾏
Cook Mode
時間
Loose Files
Cook 初回
FullCook
785.7s
Cook出⼒
試⾏
Cook Mode
時間
Zen Server Oplog
Zen Cook 初回
Full Cook
788.7s
計測条件
効果
Unreal Engine: UE5.8.1
Project: CitySample
CPU: AMD Ryzen Threadripper PRO 3995WX 64-Cores
GPU: NVIDIA GeForce RTX 3080
DRAM: 256GB DDR4
Disk: AMD-RAID Array2 SCSI Disk Device
Cook vs ZenCook 単体では差が殆どない


# Page. 32

![Page Image](https://bcdn.docswell.com/page/GE5MX6P2E4.jpg)

Cook と Zen Cook ではどう違う？
Zen Cook ⾃体の速度は Cook と変わらない、後⼯程も含むトータルで⾼速化
観点
Cook
Zen Cook
出⼒単位
ファイル
チャンク
未変更データ
毎回書き出す
送らない
⼤きいデータ
ソケット経由
ソケットを介さない
圧縮
書き込み時
並列タスクで先に実施
成果の形
後⼯程で変換
Cook時点でIoStoreのフォーマット
Zen Cook における最⼤の強み（次ページ以降で説明）
Incremental Cook
Snapshot
未変更パッケージのCook処理を省略
過去のCook成果を起点に増分でCookを開始


# Page. 33

![Page Image](https://bcdn.docswell.com/page/9729XM61JR.jpg)

Incremental Cook とは？
●
変更されたアセットのみを再Cookし、
Cook 時間を短縮する仕組み
●
従来の -iterativecooking（変更アセットの
み）より堅牢な -cookincremental（変更+
依存関係）がUE5.8でデフォルトに
●
エディタ設定で有効化、.iniファイルで以
前の Legacy Cook に戻すことも可能
●
Epic は CI でも Incremental Cook を活⽤
Editor.ini の [CookSettings]
; This mode was not as robust as the new Incremental
Cook, because it did not handle changes to
; c++ serialization, changes to non-package files, or
hidden dependencies undeclared to the AssetRegistry
LegacyIterative=false


# Page. 34

![Page Image](https://bcdn.docswell.com/page/DJY48X947M.jpg)

Incremental Cook の有効化
●
.ini 設定
DefaultEditor.ini
[CookSettings]
LegacyIterative=False (UE5.8ではdefault=False)
CookIncrementalDefaultIncremental=True
●
コマンドライン/UAT
‧強制的にIncremental Cook実⾏
-CookIncremental (または -forcerecook=false)
‧UATで実⾏時
-iterative (設定次第で -iterativecooking(LooseFiles)/-cookincremental(ZenStore)が実行)
●
Project Launcher


# Page. 35

![Page Image](https://bcdn.docswell.com/page/V7NYQ1L6E8.jpg)

Incremental Cook の処理フロー
Zen Server / Oplog
Cooker / UCookOnTheFlyServer
1.検索
必要なパッケージを列挙
Read
2.前回の鍵を読む
attachment
meta.cook.artifacts
=前回のStoreKeyと依存
StoredKeyをRead
3.今回の鍵を計算
CurrentKeyを計算
4.判定 HashKeyMatch
Key+依存の変更なし？
なし
Cook済み本体
あり
⼀致 → skip
不⼀致/なし → recook
Open/Save/Commitなし
Open/Save/Commit実⾏
次のパッケージへ
Commit
PackageData / BulkData
(IoStoreチャンク)


# Page. 36

![Page Image](https://bcdn.docswell.com/page/YJ9PD54R73.jpg)

Zen Cook (Incremental Cook) の効果
Cook出⼒
試⾏
Cook Mode
時間 (s)
Cook 初回
FullCook
785.7
Cook 2回⽬
Iterative Cook
53
試⾏
Cook Mode
時間
Zen Cook 初回
Full Cook
788.7
Zen Cook 2回⽬
Incremental Cook
62
Loose Files
Cook出⼒
Zen Server Oplog
計測条件
効果
Unreal Engine: UE5.8.1
Project: CitySample
CPU: AMD Ryzen Threadripper PRO 3995WX 64-Cores
GPU: NVIDIA GeForce RTX 3080
DRAM: 256GB DDR4
Disk: AMD-RAID Array2 SCSI Disk Device
‧Cook vs ZenCook 単体では差が殆どない
‧反復 Cook はいずれも10倍以上早くなる
‧反復 Cook 実施時もレガシーに負けることがある
→ 依存関係正しく検証する処理が追加されるため
→ 速度はやや劣るものの、反復の正確性は⾼い


# Page. 37

![Page Image](https://bcdn.docswell.com/page/GJ8D3YQGJD.jpg)

Snapshot とは？
●
Cookの「基点」を CI から配布、Cook済みアセットを共有する仕組み
○ Snapshot なし：Cook の基点は⾃分が前回Cookした結果
○ Snapshot あり：CI が公開した Cook 結果を基点に Incremental Cook で短縮
●
Snapshot は Import / Export することで共有可能
○ Export：ZenServer上のデータを FileServer/他ZenServer/Cloud 等へ出⼒
○ Import：descriptor を⾒て Zen Local へ取り込む
●
実機確認における効果が有⽤なケース
○ 効果⼤：新規ワークスペース、久しぶりのCook、CIの新規エージェント
○ 効果⼩：毎⽇Cookしている⼈には差が⼩さく、効果も薄い


# Page. 38

![Page Image](https://bcdn.docswell.com/page/LJLMV4XXER.jpg)

Snapshot を利⽤した検証構成
クラウド
① CL同期とCook
Cook済みデータ充填
② Snapshot Export
正本‧履歴‧開発者⽤
Cloud DDC
ファイルサーバ
Horde
④ Snapshot Import
③ Snapshot Export
ローカル検証⽤
オフィス共通検証⽤
ローカルPC
エディタ
Zen Local
オフィスPC
Zen Shared


# Page. 39

![Page Image](https://bcdn.docswell.com/page/47MYGKL37W.jpg)

Snapshot を利⽤した検証フロー
●
基本：CI が Cook して Snapshot を Export → 開発者が Snapshot を Import
○ CI 成果の Oplog を保存、Oplogを配布して利⽤
○ BuildGraph : ZenExportSnapshot / ZenImportSnapshot
●
ケース1：特定CLの成果を保存‧共有し、検証を⾼速化
○ [CI] CL を同期 → CL でCookして Snapshot Export
○ [開発者] CL を同期 → CL の Snapshot をImport → ZenStreaming で起動
●
ケース2：Cook のたびに公開し、全員の Incremental Cook の基点にする
○ SnapshotBaseDescriptorFile を指定すれば差分 Export も可能


# Page. 40

![Page Image](https://bcdn.docswell.com/page/P7R9ZXKRE9.jpg)

例：CIから Zen Shared へ Export する BuildGraph
&lt;?xml version=&#039;1.0&#039; ?&gt;
&lt;BuildGraph xmlns=&quot;http://www.epicgames.com/BuildGraph&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
xsi:schemaLocation=&quot;http://www.epicgames.com/BuildGraph ../Schema.xsd&quot;&gt;
&lt;Option Name=&quot;ProjectFile&quot; DefaultValue=&quot;_Unknown_&quot; Restrict=&quot;.+&quot; Description=&quot;Path to the .uproject&quot;/&gt;
&lt;Option Name=&quot;TargetPlatform&quot; DefaultValue=&quot;Windows&quot; Restrict=&quot;.+&quot; Description=&quot;Cook platform to export&quot;/&gt;
&lt;Option Name=&quot;DestinationZenHost&quot; DefaultValue=&quot;http://10.7.101.29:8558&quot; Restrict=&quot;.+&quot; Description=&quot;Shared Zen
host URL&quot;/&gt;
&lt;Option Name=&quot;DestinationIdentifier&quot; DefaultValue=&quot;cl-$(Change)&quot; Restrict=&quot;.+&quot; Description=&quot;Oplog identifier.
Defaults to cl-&amp;lt;P4 changelist&amp;gt;.&quot;/&gt;
&lt;Error Message=&quot;No project file specified. Pass -project=&amp;lt;path.uproject&amp;gt;.&quot; If=&quot;&#039;$(ProjectFile)&#039; ==
&#039;_Unknown_&#039;&quot;/&gt;
&lt;Agent Name=&quot;Export Agent&quot; Type=&quot;Win64&quot;&gt;
&lt;Node Name=&quot;Publish Snapshot $(ProjectName) $(TargetPlatform)&quot;&gt;
&lt;ZenExportSnapshot
Project=&quot;$(ProjectFile)&quot;
Platform=&quot;$(TargetPlatform)&quot;
DestinationStorageType=&quot;Zen&quot;
DestinationZenHost=&quot;$(DestinationZenHost)&quot;
DestinationIdentifier=&quot;$(DestinationIdentifier)&quot;
SnapshotDescriptorFile=&quot;$(ProjectDir)/Saved/Snapshots/$(TargetPlatform).json&quot;/&gt;
&lt;/Node&gt;
&lt;/Agent&gt;
&lt;Aggregate Name=&quot;PublishSnapshot&quot; Requires=&quot;Publish Snapshot $(ProjectName) $(TargetPlatform)&quot;/&gt;
&lt;/BuildGraph&gt;
例：UAT からの Export
Engine\Build\BatchFiles\RunUAT.bat BuildGraph ^
-Script=Engine\Build\Graph\PublishSnapshot.xml ^
-Target=PublishSnapshot ^
-project=D:\Proj\MyGame\MyGame.uproject ^
-set:TargetPlatform=Windows ^
-NoP4


# Page. 41

![Page Image](https://bcdn.docswell.com/page/PJXQ96LY7X.jpg)

例：CIが出した Snapshot を Zen Local へ Import する BuildGraph
&lt;?xml version=&#039;1.0&#039; ?&gt;
&lt;BuildGraph xmlns=&quot;http://www.epicgames.com/BuildGraph&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
xsi:schemaLocation=&quot;http://www.epicgames.com/BuildGraph ../Schema.xsd&quot; &gt;
&lt;Option Name=&quot;ProjectFile&quot; DefaultValue=&quot;_Unknown_&quot; Restrict=&quot;.+&quot; Description=&quot;Path to the .uproject&quot;/&gt;
&lt;Option Name=&quot;DescriptorFile&quot; DefaultValue=&quot;_Unknown_&quot; Restrict=&quot;.+&quot; Description=&quot;snapshot.json produced by CI&quot;/&gt;
&lt;Agent Name=&quot;Import Agent&quot; Type=&quot;Win64&quot;&gt;
&lt;Node Name=&quot;Import Snapshot&quot;&gt;
&lt;ZenImportSnapshot Project=&quot;$(ProjectFile)&quot; SnapshotDescriptorFile=&quot;$(DescriptorFile)&quot;/&gt;
&lt;/Node&gt;
&lt;/Agent&gt;
&lt;Aggregate Name=&quot;ImportSnapshot&quot; Requires=&quot;Import Snapshot&quot;/&gt;
&lt;/BuildGraph&gt;
例：UAT からの Snapshot を Import
Engine\Build\BatchFiles\RunUAT.bat BuildGraph ^
-Script=Engine\Build\Graph\ImportSnapshot.xml ^
-Target=ImportSnapshot ^
-project=D:\Proj\MyGame\MyGame.uproject ^
-set:DescriptorFile=\\fileserver\CookedSnapshots\main\latest\Windows\snapshot.json ^
-NoP4


# Page. 42

![Page Image](https://bcdn.docswell.com/page/3JK9P1L4JD.jpg)

Zen Cook のベストプラクティス
●
Zen Store を有効化した環境を準備
●
開発者とCI で Incremental Cook を活⽤
○ Cook 時間を短縮することで待ちを減らし試⾏を増やす
●
定常的に Snapshot を配布
○ 問題発⽣時に特定のCLに同期して迅速に検証して対処
○ QAは特定の環境で検証しやすい
●
Zen Shared を利⽤
○ 全CLの oplog を貯め続けることで検証を⾼速化
○ ストレージ容量には注意


# Page. 43

![Page Image](https://bcdn.docswell.com/page/LE3WXQ3DE5.jpg)

Chapter 3
Zen Streaming


# Page. 44

![Page Image](https://bcdn.docswell.com/page/8EDK29427G.jpg)

実機確認（従来の運⽤）の基本
●
●
アセットCookして実機で確認するためのワークフロー
「実機での反復チェック」⽤途では転送コストが⽬⽴ち、待ち時間が⻑い
Cook On The Fly
要求毎に都度Cookして供給
待ち：Cook+転送
起動
要求
都度Cook
都度転送
表⽰
全件Cook
成果を配置
Copy
Launch
表⽰
全件Cook
Package
Deploy
Launch
表⽰
Cook By The Book
事前にCookし配置して起動
待ち：Cook+コピー
Package
パッケージ作成
待ち：Cook+Pak+Deploy


# Page. 45

![Page Image](https://bcdn.docswell.com/page/V7PK1ZMLJ8.jpg)

Zen Streaming の基本（現在の運⽤）
●
●
●
●
基本的には Cook → Package → Deploy → Launch という流れは同じ
軽量なパッケージ Package/Deploy
○ 実⾏ファイル + Project Store のみの軽量版パッケージを作成/配置
起動時に アセットを Zen Server から Streaming
○ アプリケーションが HTTP で Zen Server からチャンクを取得
2回⽬の起動はクライアントキャッシュ（4GB）が効くため⾼速な起動が可能
○ STORAGE_SERVER_PLATFORM_CACHE_SIZE_KB 、プラットフォーム依存
○ 同⼀セッションはメモリ上に残るため同様に⾼速
Zen Streaming
Zen Server からの転送
Incremental
Cook
軽量な
Package
軽量な
Deploy
Launch
表⽰


# Page. 46

![Page Image](https://bcdn.docswell.com/page/2JVVYW96JQ.jpg)

Zen Streaming（現在の運⽤）のフロー
⾼速
ローカルPC
② アプリケーション
Deploy
実機デバイス
実⾏バイナリ+ProjectStore
エディタ
① Incremental Cook
oplogを充填
アプリ
ケーション
③ アセット参照
Zen Server
Serverからストリーミング
⾼速


# Page. 47

![Page Image](https://bcdn.docswell.com/page/5EGL9DZ2JL.jpg)

Zen Streaming の有効化
● プロジェクト設定 (UE5.8ではデフォルト有効 / Zen Cook 利⽤前提)
●
BaseGame.ini
● )
[/Script/UnrealEd.ProjectPackagingSettings]
bUseZenStore=True
bUseIoStore=True
●
コマンドライン/UAT
-zenstore -cook -stage -deploy(-pak なし)
●
Project Launcher


# Page. 48

![Page Image](https://bcdn.docswell.com/page/4JQYW1L97P.jpg)



# Page. 49

![Page Image](https://bcdn.docswell.com/page/K74WKR5RE1.jpg)

Zen Streaming の効果
時間 (s)
起動⽅法
Build
Cook
Stage
Deploy
Launch
Total
Development Package
(Project Launcher)
4.0
175.3
115.5
188.7
43.0
526.5
Zen Streaming Incremental
(Project Launcher)
3.5
68.2
2.1
0.2
42.0
116.0
計測条件
効果
Unreal Engine: UE5.8.1
Project: CitySample
CPU: AMD Ryzen Threadripper PRO 3995WX 64-Cores
GPU: NVIDIA GeForce RTX 3080
DRAM: 256GB DDR4
Disk: AMD-RAID Array2 SCSI Disk Device
‧Stage, Deployの重い⼯程がほぼスキップされるので
早くなる、この結果だけ⾒ると5倍近く早い


# Page. 50

![Page Image](https://bcdn.docswell.com/page/LJ1YXQWVEG.jpg)

Zen Streaming の効果
時間 (s)
起動⽅法
Build
Cook
Stage
Deploy
Launch
Total
Zen Streaming Incremental
(Project Launcher)
3.5
68.2
2.1
0.2
42.0
116.0
Quick Launch
(Editor)
2.7
788.7
2.0
0.2
42.2
835.8
Quick Launch Incremental
(Editor)
2.6
68.1
1.9
0.2
42.3
115.1
計測条件
効果
Unreal Engine: UE5.8.1
Project: CitySample
CPU: AMD Ryzen Threadripper PRO 3995WX 64-Cores
GPU: NVIDIA GeForce RTX 3080
DRAM: 256GB DDR4
Disk: AMD-RAID Array2 SCSI Disk Device
‧ZenStore=True の場合、Quick Launch は Zen
Streaming で起動する
‧Quick Launch時は設定 で Incremental Cook を有
効にすると⾼速（無効時はFull Cook、これで同等)


# Page. 51

![Page Image](https://bcdn.docswell.com/page/GJWGNM6372.jpg)

Project Launcher の Content Scheme


# Page. 52

![Page Image](https://bcdn.docswell.com/page/4EZL3QYG73.jpg)

Project Launcher の Content Scheme
Scheme
データの置き場
起動時の読み⽅
UAT
Pak Files
提出に近い実機確認
Stage上の .pak /.ucas /.utoc
本体（または Stage）のコンテナ
-cook -pak -iostore -stage
-deploy
Zen Streaming
反復確認
zenserver oplog
HTTP でチャンク取得
-zenstore -cook -stage -deploy
Zen Pak Streaming
既にPakがある反復確認
既存 Pak + PC の Stage を share
ローカル Pak + /ws オーバーレイ
-skipcook -skippak
-ZenWorkspaceSharePath=
Development Package
提出に近い実機確認
開発⽤パッケージ
パッケージをDeploy+Launch
-package
Submission Package
提出⽤
ストア提出⽤パッケージ / パッチ
提出物として出⼒
Shipping + release/patch/DLC
Loose Files (legacy)
ZenStore=OFF時のみ
Saved/Cooked の個別ファイル
ディスク or FileServer
Zen Store なし の CBTB
Cook On The Fly
その場で Cook
必要時にネットワーク転送
-cookontheﬂy + FileServer
Use Current Staged Build
既存の StagedBuilds
再 Cook / 再 Stage しない
-prestaged


# Page. 53

![Page Image](https://bcdn.docswell.com/page/Y76WX6DQ7V.jpg)

Zen Pak Streaming の利⽤
●
コンテナファイル（.pak、.ucas、.utoc）をベースとして、差分のみを Zen
Streaming による上書きをする機能
○ ベースビルドが既にあり、差分だけ何度も確認したいケースで有⽤
○ 全体をZenから読むか、Pakベース + 差分オーバーライドか
Zen Streaming
Zen Pak Streaming
参照
参照
参照
.toc
Zen Server
アプリケーション
コンテナファイル
Zen Server
アプリケーション


# Page. 54

![Page Image](https://bcdn.docswell.com/page/G75MX63274.jpg)

Zen Pak Streaming のイメージ
ローカルPC
② アプリケーション
Deploy
実機デバイス
実⾏バイナリ+projectstore
① Pakファイル作成
コンテナファイル
エディタ
⑤ フォールバック
WSになく実機にあれば参照
アプリ
ケーション
.toc
④ 取得
WSもあればチャンク取得
Zen Server
③ アセット参照
Serverからストリーミング
.toc


# Page. 55

![Page Image](https://bcdn.docswell.com/page/9J29XMZ1ER.jpg)

●
Zen Pak Streaming をUATから実⾏時に有効化
Engine\Build\BatchFiles\RunUAT.bat BuildCookRun ^
-project=D:\Proj\MyGame\MyGame.uproject ^
-TargetPlatform=Win64 -skipbuild -skipcook -skippak -stage -deploy -run ^
-ZenWorkspaceSharePath=&quot;D:\Proj\MyGame\Saved\StagedBuilds\Windows&quot;
●
Zen Pak Streaming をProject Launcherから実⾏時に有効化


# Page. 56

![Page Image](https://bcdn.docswell.com/page/DEY48XR4JM.jpg)

Zen Streaming のベストプラクティス
●
デバイスとの接続は有線で、⾼速アダプタの利⽤を推奨
●
初回ロードはネットワーク RTT/帯域に依存
●
コード‧コンテンツ変更時のイテレーションに最適
○ プロファイリング、Shipping ビルド、デバイスがリモートの場合は向かない
●
Zen Streaming は参照する Zen Server を指定可能
○ ローカルに Zen Server が無い場合や、CIが作成した Oplog ベースで確認した
いケース（QAテスト等）では、Zen Shared を参照して確認も可能


# Page. 57

![Page Image](https://bcdn.docswell.com/page/VJNYQ1D678.jpg)

まとめ


# Page. 58

![Page Image](https://bcdn.docswell.com/page/YE9PD5GRJ3.jpg)

Zen
DDC
Zenをフル活⽤した構成
Zen
Cook
Zen
Streaming
クラウド
Horde
夜間ビルド
定常ジョブ
ローカルPC
Import
Export
DDCFill
Cloud DDC
File Server
Cloud DDC
Zen Shared
Snapshot
Sharedの上流
DDCハブ
当⽇Oplogの配信先
Import
Import
Oplog
DDC
Zen Shared
Editor
DDCハブ‧当⽇Oplogの配信先
ローカルPC
リモート
開発者
オフィス
DDC/Cook
ローカルPC
DDC
ローカルPC
DDC
Zen Local
DDC+Oplog
Streaming
実機
Zen Streaming
で起動
開発者
Editor
Editor
ローカルPC
ローカルPC
DDC/Cook
QA
DDC/Cook
Zen Local
Zen Local
DDC+Oplog
DDC+Oplog
Streaming
Streaming
実機
実機
Zen Streaming
ローカル起動
当⽇のOplogで
Zen Streaming
Streaming


# Page. 59

![Page Image](https://bcdn.docswell.com/page/GE8D3YVGED.jpg)

Thank


