한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

遊戲 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 與指標
深入了解
在電腦上,建立過一次的著色器會由顯示卡驅動程式存進著色器快取,之後重複使用。因此在更新顯示卡驅動程式或遊戲更新剛推出時,這個快取會失效,原本正常的人也會有一段時間再度卡頓。典型的回報是「更新後每到一個沒去過的地方就頓一下」。

出處

  1. Shader loading Unity
    第一次使用某個著色器變體時,顯示卡驅動程式要替 GPU 建立它,可能明顯停住;建立過的會被快取,不會再停住
  2. Optimizing Rendering With PSO Caches in Unreal Engine Epic Games
    在需要的當下才建立管線狀態(PSO)可能花上 100ms 以上,必須預先建立
  3. Direct3D 12 Return Codes Microsoft
    D3D12_ERROR_DRIVER_VERSION_MISMATCH:用不同驅動程式版本建立的 PSO 快取無法重複使用(驅動程式更新後需重新編譯)
  4. PresentMon Capture Application (README-CaptureApplication.md) Intel
    以 FrameTime(畫格之間的 CPU 時間)錄下每個畫格的時間
  5. PSO Precaching for Unreal Engine Epic Games
    開啟 r.PSOPrecache.Validation 後,可用 stat PSOPrecache 查看漏掉的 PSO 統計,並在 log 留下「PSO PRECACHING MISS」;執行階段建立 PSO 超過預設的 20ms 就計為一次 hitch

相關原因

同一層:L1 用戶端遊戲程式

同一症狀(定格)在其他層的原因

查看含圖解與實驗的完整版卡片