遊戲 Lag 白皮書 › L1 用戶端遊戲程式
儲存裝置太慢,資源串流跟不上 Slow storage stalls asset streaming
原因 ID cg-asset-stream · 主要負責 遊戲開發團隊(用戶端開發) · 協同 外部(外部)
在含圖解與實驗的完整版中開啟卡片 →
在 HDD 這類較慢的儲存裝置上,讀取開放世界貼圖與模型的速度跟不上移動,物件會晚出現,或遊戲為了等待讀取而卡頓。
為什麼 騎坐騎、傳送等快速移動,或進入人多的地方,一次需要大量新的貼圖與模型 → 於是 HDD 等較慢的儲存裝置無法以需要的速度讀取,讀取請求越積越多,部分載入還要主執行緒等到完成為止 → 畫面上 貼圖有一段時間是模糊的,建築與角色晚出現;等待讀取的瞬間出現卡頓、定格
- 症狀
- 看不見/幽靈物件, 卡頓, 定格
- 因素
- 停滯
- 誰會遇到
- 只有我
- 何時
- 移動中/切換地圖時, 人潮湧入時
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發) · 協同 外部(外部)
- 遊戲開發團隊要做的事
- 採用主執行緒不必等待讀取的非同步串流、依移動方向與速度預先讀取、先顯示低解析度(mipmap)與簡化模型再替換、快速移動時串流跟不上就暫時限制移動速度或改用讀取畫面、在最低與建議配備中註明是否需要 SSD。
- 外部要做的事
- 引導玩家把遊戲安裝在 SSD 上,並請玩家確認同一顆磁碟上是否正在下載或執行防毒掃描。
- 數值參考
- 根據 Microsoft 的說明,舊式硬碟每秒可讀取數十 MB,NVMe SSD 每秒可讀取數 GB,而上一世代的遊戲串流每秒大約使用 50MB。以 SSD 速度為前提、讀取量遠多於此的遊戲放在 HDD 上執行,讀取很容易跟不上移動。
- 圖表上
- 只有部分偏高 · 畫格尖峰次數(依儲存裝置類型)、磁碟讀取延遲
- 查看位置
- 快速移動時,同時記錄 Windows 效能監視器的 PhysicalDisk\Avg. Disk sec/Read(單次讀取的平均時間)、Current Disk Queue Length 與 PresentMon 畫格時間。開發版本看 Unreal 的 stat Streaming、stat AsyncLoad,以及 Unity Profiler 的 AssetBundle.asset/allAssets 警告(在載入完成前就要求結果,主執行緒只好等待)
- 符合的跡象
- 快速移動時磁碟讀取延遲與佇列暴增,同一時間畫格飆高,或貼圖、物件晚出現。同一場景改在 SSD 上執行就消失
- 不符合的跡象
- 磁碟很閒、貼圖卻模糊時,是「顯示記憶體(VRAM)不足」;同一個地方第二次去就正常時,是「主執行緒同步載入、著色器編譯」
- 確認方式
- 在玩家端環境確認
- 深入了解
- 如果只有第一次停住、之後就正常,比較接近「主執行緒同步載入、著色器編譯」;只有儲存裝置慢的電腦每次移動都重複發生,就是這個原因。顯示記憶體不夠、貼圖被反覆移出又載入的「顯示記憶體(VRAM)不足」也會造成貼圖模糊,所以要同時查看磁碟讀取等待與顯示記憶體用量。防毒軟體的即時掃描會在遊戲每次開啟檔案時介入,也可能讓讀取更慢。
出處
- DirectStorage is coming to PC Microsoft
舊式硬碟每秒數十 MB,NVMe SSD 每秒數 GB,上一世代遊戲的資源串流預算約每秒 50MB;開放世界遊戲會在移動時即時讀入遠方景物,用完就丟棄 - Texture and mesh loading Unity
同步上傳在主執行緒的一個畫格內讀取並上傳,造成明顯的停頓;非同步上傳則分散在多個畫格串流 - Texture Streaming Overview for Unreal Engine Epic Games
串流器依視點調高或調低貼圖解析度(mip),大部分計算在非同步工作執行緒進行,並優先載入畫面上看得到的 mip - Profiler markers reference Unity
AssetBundle.asset/allAssets 警告:在載入完成前就要求結果,主執行緒停下來等待 - Stat Commands in Unreal Engine Epic Games
stat Streaming(串流貼圖的記憶體與數量)、stat AsyncLoad(非同步載入統計) - Windows Performance Monitor Disk Counters Explained Microsoft
Avg. Disk sec/Read 是完成一次讀取的平均時間(I/O 延遲),Current Disk Queue Length 是量測當下的磁碟佇列長度 - PresentMon Capture Application (README-CaptureApplication.md) Intel
以 FrameTime(畫格之間的 CPU 時間)錄下每個畫格的時間 - About regular quick and full scans with Microsoft Defender Antivirus Microsoft
即時保護會在每次開啟、關閉檔案時掃描
相關原因
同一層:L1 用戶端遊戲程式
同一症狀(看不見/幽靈物件)在其他層的原因
查看含圖解與實驗的完整版卡片