(轉載)(官方)UE4--圖像編程----FShaderCache
FShaderCache
總覽
FShaderCache 提供的機制可減少遊戲中著色器的卡頓。它支持 OpenGLDrv 和 MetalRHI RHIs,可在 Mac、Linux 和 Windows 平臺上使用。
可通過多個控制臺命令啟用或禁用 FShaderCache 功能。
控制臺命令 |
描述 |
---|---|
|
|
|
追蹤 RHI 繪制狀態,使每個束縛著色器態均可被預繪制。 |
|
預繪制追蹤的 RHI 繪制狀態,消除首次使用的卡頓。 |
|
控制每幀預繪制時間。如有需要,在多個幀上進行分布。全部使用 -1。 |
|
將所有著色器字節碼累加到一個單獨的緩存文件中 |
|
遊戲進程中著色器代碼的異步預編譯 |
|
啟用 r.UseAsyncShaderPrecompilation 時維持的最大目標幀時。使用 -1 一次性預編譯所有著色器。 |
|
處於非互動模式中(如加載畫面)時臨時加速預繪制的選項。選擇 0 使用 |
|
處於非互動模式中(如加載畫面)時加速異步預編譯的選項。選擇 0 使用 r.TargetPrecompileFrameTime。 |
|
啟動時進入異步預編譯前著色器加載所消耗的時間最大量。使用 -1 進行同步加載) |
使用
應在開發機上啟用 r.UseShaderCaching
和 r.UseShaderDrawLog
填充緩存。 用戶/玩家應啟用 r.UseShaderCaching
和 r.UseShaderPredraw
消耗緩存。 繪制日誌(r.UseShaderDrawLog
)會添加明顯的固定系統開銷,盡量不要在發布產品中使用。 二進制著色器緩存可在遊戲進程中或打包過程中(當前僅限 Mac 目標)被累加,方法為指定著色器平臺在 CachedShaderFormats 陣列(在 Engine.ini 的 /Script/MacTargetPlatform.MacTargetSettings 設置組中)中進行緩存。 對於 OpenGL 而言,二進制緩存包含足夠的著色器管線數據來構造全鏈接 GL 程序或 GL 程序管線(取決於 GL_ARB_separate_shader_objects 是否可用),但用於其他 RHI 上管線構造的數據卻不足。 這有助於在未首先完成遊戲進程的情況下降低 OpenGL 上出現的卡頓。如以最佳效果運行,仍然建議首先完成遊戲進程。 緩存通過著色器散列完成,內容大部分已完成時建議只將其用作最終優化工具, 因為對著色器散列進行修改將導致未使用的條目在緩存中累加,增加緩存大小,但不會減少卡頓。
代碼將先嘗試並加載可寫入的緩存,然後根據需要返回到分布緩存。
緩存類型 |
緩存位置 |
---|---|
可寫入 |
|
分布 |
|
整合步驟
可通過眾多控制臺命令減少項目中的卡頓,使用推薦的優先順序可啟用最大化性能的選項,同時避免執行額外的項目工作。
-
在項目配置中為所有用戶啟用
r.UseShaderCaching
和r.UseShaderPredraw
。 -
盡量只在內部版本上啟用
r.UseShaderDrawLog
並確保著色器繪制狀態在每個版本的最終 QA 中均被記錄。無法實行時(如極大和/或流送遊戲),對所有用戶啟用。
測試此設置是否足以將卡頓降低到可接受的範圍,額外的優化需要更多工作,且負面影響極大。
-
如以上設置不足以解決問題,啟用
r.UseShaderBinaryCache
並配置 CachedShaderFormats,確保二進制緩存的填充(當前僅限 Mac)。 -
現在所有著色器代碼均將在啟動時加載,所有預繪制操作將發生在第一幀。如加載時間太過極端,將
r.PredrawBatchTime
設為大於 0 ms 即可在每幀中消耗預繪制。 -
還可為
r.AccelPredrawBatchTime
指定較大的值。顯示加載畫面或其他非互動內容時可應用此值。 -
調用
FShaderCache::BeginAcceleratedBatching
告知著色器緩存可以犧牲遊戲幀率為代價加速預繪制;有必要返回開銷較低的預繪制分批時,調用FShaderCache::EndAcceleratedBatching
。 -
調用
FShaderCache::FlushOutstandingBatches
將在下一幀處理所有剩余的著色器。 -
如項目初始加載仍然過長,則啟用
r.UseAsyncShaderPrecompilation
並將r.InitialShaderLoadTime
設為大於 0 的值。隨著著色器初始加載時間的增加,必須在遊戲運行時處理的工作便會減少。 -
調整所需的目標幀時時可修改
r.TargetPrecompileFrameTime
的數值,對著色器進行異步預編譯。 -
和預繪制分批相同,可指定一個更為主動的值進行預編譯:將
r.AccelTargetPrecompileFrameTime
設為較大的值,然後調用FShaderCache::BeginAcceleratedBatching
(之後調用FShaderCache::EndAcceleratedBatching
)。 -
啟用
r.UseAsyncShaderPrecompilation
後,調用FShaderCache::FlushOutstandingBatches
也將會清空所有未解決的編譯請求。
處理更新/失效
緩存需要更新且可寫入緩存已失效時,遊戲應指定一個新的 GameVersion。 初始化 RHI(它將初始化緩存)之前調用 FShaderCache::SetGameVersion
。這將導致之前版本生成的緩存內容被無視。當前無法繼承之前版本的緩存條目。
區域/流送分批
對流送遊戲或緩存極大的內容而言,應根據需求針對當前相關遊戲區域/流送等級添加對 FShaderCache::SetStreamingKey
含唯一值的調用。錄入的繪制狀態將被連接到使用的流送鍵。這將把預繪制限制為之後運行中使用的流送鍵所要求的繪制狀態。
原文地址:https://docs.unrealengine.com/latest/CHN/Programming/Rendering/FShaderCache/index.html
(轉載)(官方)UE4--圖像編程----FShaderCache