UE5.1からUE5.2へアップデートしてから, C++プロジェクトのビルド時間が5倍以上に増えて困った.
ソースコードを色々書き換えて調べたところ,
GlobalShader派生クラスへのSRV, UAV設定関数をフラットに記述する数が大きく影響
というところまでわかったのでメモ.
私と同じ沼にハマったひとの役にたてば幸い.
具体的には以下のUtil関数が該当
RenderCore/Public/ShaderParameterUtils.h SetSRVParameter() SetUAVParameter()
これらを一つの関数内で直接大量に(フラットに)記述するとビルド時間が大きく増加する模様.
対策としては Shader単位等で関数化してそれを呼び出すような記述 とするとUE5.1以前と同じくらいのビルド時間だった.
// ビルド時間が増えるパターン 100個くらい並んでました. void MainFunc() { // 全てのShaderに対するSetSRV/SetUAVをフラットに記述. SetSRVParameter(ShaderA, SRV); SetSRVParameter(ShaderA, SRV); SetUAVParameter(ShaderA, UAV); SetUAVParameter(ShaderA, UAV); ... SetSRVParameter(ShaderZ, SRV); SetSRVParameter(ShaderZ, SRV); SetUAVParameter(ShaderZ, UAV); SetUAVParameter(ShaderZ, UAV); }
エンジン側のソースコードを見るとシェーダ毎等で関数に分けていたため,
そのように書き直したところビルド時間が以前と同じくらいになった.
// ビルド時間が増えないパターン. void SetParamShaderA() { SetSRVParameter(ShaderA, SRV); SetSRVParameter(ShaderA, SRV); SetUAVParameter(ShaderA, UAV); SetUAVParameter(ShaderA, UAV); ... } ... void SetParamShaderZ() { SetSRVParameter(ShaderZ, SRV); SetSRVParameter(ShaderZ, SRV); SetUAVParameter(ShaderZ, UAV); SetUAVParameter(ShaderZ, UAV); ... } void MainFunc() { // Shader毎のSRV/UAV設定メソッドを記述. SetParamShaderA(...); ... SetParamShaderZ(...); }
私のプロジェクトでは前者の場合 8分前後 かかっていたものが, 後者に修正したところ 1分前後 に短縮された.
========== リビルド は 08:04.257 分 かかりました ==========
↓
========== リビルド は 01:12.661 分 かかりました ==========
Inlineやtemplate展開が関係していたりするのでしょうか?
詳しい人がいれば教えてください
以上