遊戲 Lag 白皮書 › L2 用戶端 OS 與裝置
視窗最小化或非作用中時的處理限制 Minimized / unfocused window throttling
原因 ID co-unfocused · 主要負責 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
切到其他視窗或把遊戲最小化時,遊戲與 Windows 會為了省電讓遊戲跑得比較慢。回到遊戲時,累積的封包會一口氣湧入,或者早已斷線。
為什麼 用 Alt+Tab 切到其他視窗,或把遊戲最小化 → 於是 遊戲看不見的期間,FPS 會大幅降低或停止,Windows 也會調低看不見的程式的優先順序 → 畫面上 切回來的瞬間出現快轉,切出去太久則會斷線
- 症狀
- 快轉, 卡頓, 斷線
- 因素
- 停滯
- 誰會遇到
- 只有我
- 何時
- 做特定動作時, 閒置一段時間後
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發)
- 遊戲開發團隊要做的事
- 視窗看不見時,封包接收與心跳封包仍在獨立執行緒中持續處理;確認引擎的「在背景執行」設定;切回來時一次同步到最新狀態。
- 數值參考
- 視窗看不見時把 FPS 降到 5~10,一個畫格就是 100~200ms。每個畫格處理一次封包的遊戲,讀取封包也會晚同樣的時間。
- 圖表上
- 中斷後一次湧入 · 畫格間隔(切換視窗前後)、已處理的封包數
- 查看位置
- 開著 PresentMon 試著按 Alt+Tab 或最小化,查看視窗看不見時的畫格間隔。在遊戲 log 中記錄視窗焦點改變的時間,與斷線原因對照
- 符合的跡象
- 視窗看不見的期間畫格間隔拉長到 100ms 以上,或紀錄中斷;切回來的瞬間一次處理累積的封包而出現快轉。切出去太久時因心跳逾時而斷線
- 不符合的跡象
- 視窗一直開在前景也一樣時,是「背景處理程序占用 CPU」或網路端問題
- 確認方式
- 在玩家端環境確認
- 深入了解
- Windows 11 不保證最小化或完全被遮住、也沒有發出聲音的視窗程式能取得 1ms 計時器。以電池運作的筆電會把這類程式降到最省電的速度,若 CPU 混用不同種類的核心,有時也會把它們放到較慢的效率核心上執行。同一台電腦的兩個用戶端中只有背景那一個異常時,請一併參考「背景視窗的處理限制」項目。
出處
- Quality of Service Microsoft
既看不見也聽不到的視窗程式屬於 Low QoS,使用電池時會以最有效率的 CPU 速度與效率核心排程 - timeBeginPeriod function (timeapi.h) Microsoft
Windows 11 不保證被遮住或最小化視窗的處理程序能取得高於預設的計時器解析度 - Application.runInBackground Unity
Unity 預設值為 false,視窗切到背景時遊戲迴圈會停止 - PresentMon Capture Application (README-CaptureApplication.md) Intel
MsBetweenPresents:這次 Present() 呼叫與上次呼叫之間的時間(ms)
相關原因
同一層:L2 用戶端 OS 與裝置
同一症狀(快轉)在其他層的原因
查看含圖解與實驗的完整版卡片