遊戲 Lag 白皮書 › L1 用戶端遊戲程式
主執行緒同步載入、著色器編譯 Synchronous asset load, shader compile
原因 ID cg-sync-load · 主要負責 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
要繪製第一次出現的地圖、怪物、特效之前,得先讀取檔案並建立著色器,畫面因此停住。
為什麼 進入新地圖,或第一次出現的技能、裝備、怪物登場 → 於是 主執行緒等待讀取檔案與著色器編譯 → 畫面上 只有第一次停住 0.1~1 秒,第二次起就正常
- 症狀
- 定格, 卡頓
- 因素
- 停滯
- 誰會遇到
- 只有我
- 何時
- 移動中/切換地圖時, 做特定動作時
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發)
- 遊戲開發團隊要做的事
- 非同步載入、預先載入(prewarming)、在讀取畫面或首次執行時預先編譯著色器、善用讀取畫面。
- 數值參考
- 編譯一個著色器需要數十 ms,久的話超過 100ms。貼圖載入依儲存裝置速度需要數十~數百 ms。
- 圖表上
- 剛開服或維護結束後暴增 · 畫格尖峰次數(遊戲或驅動程式剛更新時)
- 查看位置
- 用 PresentMon 把同一條路線錄兩次,比較第一次與第二次經過。開發版本在 Unreal 開啟 r.PSOPrecache.Validation,查看 stat PSOPrecache 與 log 中的「PSO PRECACHING MISS」;Unity 則在 Profiler 的 Timeline 查看飆高畫格中的載入與著色器區段
- 符合的跡象
- 只在第一次去的地方、第一次用的技能飆高 0.1~1 秒,第二次就消失。遊戲或顯示卡驅動程式剛更新時回報集中,之後逐漸減少
- 不符合的跡象
- 同一個地方每次都飆高時,與著色器快取無關。只有儲存裝置慢的電腦每次移動都重複發生時,是「儲存裝置太慢,資源串流跟不上」;專用 GPU 記憶體已滿時,是「顯示記憶體(VRAM)不足」
- 確認方式
- 需要遊戲伺服器/用戶端的 log 與指標
- 深入了解
- 在電腦上,建立過一次的著色器會由顯示卡驅動程式存進著色器快取,之後重複使用。因此在更新顯示卡驅動程式或遊戲更新剛推出時,這個快取會失效,原本正常的人也會有一段時間再度卡頓。典型的回報是「更新後每到一個沒去過的地方就頓一下」。
出處
- Shader loading Unity
第一次使用某個著色器變體時,顯示卡驅動程式要替 GPU 建立它,可能明顯停住;建立過的會被快取,不會再停住 - Optimizing Rendering With PSO Caches in Unreal Engine Epic Games
在需要的當下才建立管線狀態(PSO)可能花上 100ms 以上,必須預先建立 - Direct3D 12 Return Codes Microsoft
D3D12_ERROR_DRIVER_VERSION_MISMATCH:用不同驅動程式版本建立的 PSO 快取無法重複使用(驅動程式更新後需重新編譯) - PresentMon Capture Application (README-CaptureApplication.md) Intel
以 FrameTime(畫格之間的 CPU 時間)錄下每個畫格的時間 - PSO Precaching for Unreal Engine Epic Games
開啟 r.PSOPrecache.Validation 後,可用 stat PSOPrecache 查看漏掉的 PSO 統計,並在 log 留下「PSO PRECACHING MISS」;執行階段建立 PSO 超過預設的 20ms 就計為一次 hitch
相關原因
同一層:L1 用戶端遊戲程式
同一症狀(定格)在其他層的原因
查看含圖解與實驗的完整版卡片