4.26でクック時のメモリ使用量に関わる処理が変更されました。若干注意点があるため情報を共有いたします。
まず大前提として、同じアセットが複数回読み込まれないようにメモリが許す限りアセットを貯めこむ方がクック時間は短く済みことが多いと思います。
(参考)UE4における大規模背景制作事例 最適化ワークフロー編
https://www.slideshare.net/EpicGamesJapan/ue4-139190804/137
クックを行うPCの性能に合わせて適切な設定を行うことが重要です。特にCIS用のPCのメモリに余裕がある場合は有効に活用してあげましょう!
#GC条件について
4.25以前と4.26の設定値と動作を解説します。
##4.25以前
デフォルト設定はBaseEditor.iniに記述されており
[CookSettings]
PackagesPerGC=0
IdleTimeToGC=20
MaxMemoryAllowance=16384
MaxConcurrentShaderJobs=8192
MinReservedMemory=1024
MaxDiffsToLog=5
IgnoreHeaderDiffs=True
; ※MinFreeMemory設定なし
となっています。
PCに刺されたメモリが16GB以上あれば、クック中にプロセスに割り当てられた物理メモリが16GBを超えたときにGCが走ります。
#4.26
4.26では関係する設定値が変化しています。デフォルトでは、
[CookSettings]
PackagesPerGC=0
IdleTimeToGC=20
MemoryMaxUsedPhysical=16384
MemoryMinFreePhysical=1024
MaxConcurrentShaderJobs=8192
MaxDiffsToLog=5
IgnoreHeaderDiffs=True
という設定が記述されており、プロセスが使っている物理メモリが16GBを超え「かつ」システムの残り物理メモリが1GBを切ったときにGCが発生します。
(具体的な実装については、CookOnTheFlyServer.cpp の UCookOnTheFlyServer::HasExceededMaxMemory() を参照してください)
システムの残り物理メモリが1GBを切ったときという条件が ORではなくANDで入っているのが大きな違いで、OSが物理メモリが枯渇しないように適切にページアウトを行っている関係上、**なかなか1GBを割りません。**物理メモリが残り1GBを割るときはいつOutOfMemoryが出てもおかしくない状態です。
iniには記述されておらずデフォルトでは使われませんが、物理メモリでの判定ではなく 仮想メモリでの判定を行う 、 MemoryMaxUsedVirtual とMemoryMinFreeVirtual が追加されました!
#おすすめ設定
前述の通り物理メモリはOSによる管理が入っている数字なので、アプリケーションがアロケートしたメモリの総量としてはVirtualMemoryの値を参照したほうが素直です。プロジェクトのDefaultEditor.iniに設定を記述してパラメータをオーバーライドします。
[CookSettings]
;物理メモリによる条件を判定しない
MemoryMaxUsedPhysical=0
MemoryMinFreePhysical=0
;仮想メモリ使用量が32GBを超えたらGCを行う(PCによって設定を調整してください)
MemoryMaxUsedVirtual=32000
MemoryMinFreeVirtual=0