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

遊戲 Lag 白皮書 › 同步設計

依序往返過多的協定(chatty) Chatty protocol / sequential round trips

原因 ID sy-chatty · 主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)

在含圖解與實驗的完整版中開啟卡片 →

一次操作需要依序與伺服器往返好幾次時,ping 會乘上這個次數。

為什麼 開啟商店 → 請求清單 → 確認價格 → 購買 → 更新背包,每一步各自請求 → 於是 收到前一個請求的回應後才送出下一個請求 → 畫面上 ping 150ms 時買一次東西要將近 1 秒。載入特別久

症狀
輸入延遲, 連不上/無限讀取
因素
延遲
誰會遇到
只有特定功能, 只有我
何時
做特定動作時, 剛登入/維護剛結束
負責單位
主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)
遊戲開發團隊要做的事
伺服器:修改協定,把多個步驟合併成一次請求與回應(例:在購買回應中一併放入更新後的背包)。用戶端:預先取得需要的資料,採用不必等待結果的 UI。
數值參考
耗時 ≈ 往返次數 ×(ping + 伺服器處理 + tick 等待)。5 次的話,ping 150ms 時約 0.85~1 秒。
圖表上
一開始就一直偏高 · 各功能的完成時間、一次操作的往返次數
查看位置
在伺服器端的封包擷取(Wireshark)中,用測試帳號執行一次商店購買、登入之類的操作,計算期間請求與回應交替往返幾次及其間隔。有伺服器請求 log 的話,以 session ID 分組,查看請求數與每個請求的抵達、回應時間
符合的跡象
一次操作中,請求要等前一個回應後才依序往返多次,完成時間約為往返次數 × RTT,且 ping 越高的地區,玩家使用同一功能就越慢,大致成正比
不符合的跡象
往返只有一兩次、卻是某個回應花很久時,是伺服器處理或 DB 端的原因。與 ping 無關、所有玩家都一樣慢時,要查伺服器負載
確認方式
用基礎設施工具確認(不需要遊戲程式碼)

出處

  1. Chatty I/O antipattern Microsoft Azure
    小型 I/O 請求很多時,累積延遲會大幅降低回應性。建議把請求合併成更大、更少的批次

相關原因

同一層:同步設計

同一症狀(輸入延遲)在其他層的原因

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