1. 程式人生 > >(轉載)(官方)UE4--圖像編程----FShaderCache

(轉載)(官方)UE4--圖像編程----FShaderCache

幀處理 添加 代碼 問題 模式 game 處理 新的 docs

FShaderCache

總覽

FShaderCache 提供的機制可減少遊戲中著色器的卡頓。它支持 OpenGLDrv 和 MetalRHI RHIs,可在 Mac、Linux 和 Windows 平臺上使用。

可通過多個控制臺命令啟用或禁用 FShaderCache 功能。

控制臺命令

描述

r.UseShaderCaching [0/1]

  • 著色器反序列化中早提交,不為請求式。

  • 追蹤束縛著色器態,使它們在早提交中被預束縛。

r.UseShaderDrawLog [0/1]

追蹤 RHI 繪制狀態,使每個束縛著色器態均可被預繪制。

r.UseShaderPredraw [0/1]

預繪制追蹤的 RHI 繪制狀態,消除首次使用的卡頓。

r.PredrawBatchTime [Time in (ms)]

控制每幀預繪制時間。如有需要,在多個幀上進行分布。全部使用 -1。

r.UseShaderBinaryCache 0/1

將所有著色器字節碼累加到一個單獨的緩存文件中

r.UseAsyncShaderPrecompilation 0/1

遊戲進程中著色器代碼的異步預編譯

r.TargetPrecompileFrameTime [Time in (ms)]

啟用 r.UseAsyncShaderPrecompilation 時維持的最大目標幀時。使用 -1 一次性預編譯所有著色器。

r.AccelPredrawBatchTime [Time in (ms)]

處於非互動模式中(如加載畫面)時臨時加速預繪制的選項。選擇 0 使用 r.PredrawBatchTime

r.AccelTargetPrecompileFrameTime [Time in (ms)]

處於非互動模式中(如加載畫面)時加速異步預編譯的選項。選擇 0 使用 r.TargetPrecompileFrameTime。

r.InitialShaderLoadTime [Time in (ms)]

啟動時進入異步預編譯前著色器加載所消耗的時間最大量。使用 -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 上出現的卡頓。如以最佳效果運行,仍然建議首先完成遊戲進程。 緩存通過著色器散列完成,內容大部分已完成時建議只將其用作最終優化工具, 因為對著色器散列進行修改將導致未使用的條目在緩存中累加,增加緩存大小,但不會減少卡頓。

代碼將先嘗試並加載可寫入的緩存,然後根據需要返回到分布緩存。

緩存類型

緩存位置

可寫入

<Game>/Saved/DrawCache.ushadercache, <Game>/Saved/ByteCodeCache.ushadercode

分布

<Game>/Content/DrawCache.ushadercache, <Game>/Content/ByteCodeCache.ushadercode

整合步驟

可通過眾多控制臺命令減少項目中的卡頓,使用推薦的優先順序可啟用最大化性能的選項,同時避免執行額外的項目工作。

  1. 在項目配置中為所有用戶啟用 r.UseShaderCaching r.UseShaderPredraw

  2. 盡量只在內部版本上啟用 r.UseShaderDrawLog 並確保著色器繪制狀態在每個版本的最終 QA 中均被記錄。無法實行時(如極大和/或流送遊戲),對所有用戶啟用。

測試此設置是否足以將卡頓降低到可接受的範圍,額外的優化需要更多工作,且負面影響極大。

  1. 如以上設置不足以解決問題,啟用 r.UseShaderBinaryCache 並配置 CachedShaderFormats,確保二進制緩存的填充(當前僅限 Mac)。

  2. 現在所有著色器代碼均將在啟動時加載,所有預繪制操作將發生在第一幀。如加載時間太過極端,將 r.PredrawBatchTime 設為大於 0 ms 即可在每幀中消耗預繪制。

  3. 還可為 r.AccelPredrawBatchTime 指定較大的值。顯示加載畫面或其他非互動內容時可應用此值。

  4. 調用 FShaderCache::BeginAcceleratedBatching 告知著色器緩存可以犧牲遊戲幀率為代價加速預繪制;有必要返回開銷較低的預繪制分批時,調用 FShaderCache::EndAcceleratedBatching

  5. 調用 FShaderCache::FlushOutstandingBatches 將在下一幀處理所有剩余的著色器。

  6. 如項目初始加載仍然過長,則啟用 r.UseAsyncShaderPrecompilation 並將 r.InitialShaderLoadTime 設為大於 0 的值。隨著著色器初始加載時間的增加,必須在遊戲運行時處理的工作便會減少。

  7. 調整所需的目標幀時時可修改 r.TargetPrecompileFrameTime 的數值,對著色器進行異步預編譯。

  8. 和預繪制分批相同,可指定一個更為主動的值進行預編譯:將 r.AccelTargetPrecompileFrameTime 設為較大的值,然後調用 FShaderCache::BeginAcceleratedBatching(之後調用 FShaderCache::EndAcceleratedBatching)。

  9. 啟用 r.UseAsyncShaderPrecompilation 後,調用 FShaderCache::FlushOutstandingBatches 也將會清空所有未解決的編譯請求。

處理更新/失效

緩存需要更新且可寫入緩存已失效時,遊戲應指定一個新的 GameVersion。 初始化 RHI(它將初始化緩存)之前調用 FShaderCache::SetGameVersion。這將導致之前版本生成的緩存內容被無視。當前無法繼承之前版本的緩存條目。

區域/流送分批

對流送遊戲或緩存極大的內容而言,應根據需求針對當前相關遊戲區域/流送等級添加對 FShaderCache::SetStreamingKey 含唯一值的調用。錄入的繪制狀態將被連接到使用的流送鍵。這將把預繪制限制為之後運行中使用的流送鍵所要求的繪制狀態。

原文地址:https://docs.unrealengine.com/latest/CHN/Programming/Rendering/FShaderCache/index.html

(轉載)(官方)UE4--圖像編程----FShaderCache