2011-03-25 73 views
5

我正在研究Java中的多人遊戲項目,我正在嘗試優化如何收集我的等待時間測量結果。測量等待時間

我目前的設置是定期發送一批UDP數據包,獲得服務器的時間戳並返回,然後計算並記錄延遲。我拿了一些樣本,然後計算出平均值以得到延遲。

這似乎是一個合理的解決方案來解決客戶端的延遲?

+0

我假設你所有的溝通都是使用UDP完成的。 – biziclop 2011-03-25 16:40:11

+0

的確,這是正確的。 – TechyAdam 2011-03-25 17:04:14

回答

3

您還可以對遊戲協議中使用的數據包進行時間戳記。所以你將有更多的數據來整合你的統計數據。 (這種方法對於避免額外突發數據造成的開銷也很有用,您只需使用已經交換的數據來完成統計)

您也可以開始使用其他度量(例如方差)爲了更準確地估計您的連接質量。

+0

嗨0verbose,我喜歡這個想法,但我想問題是每個數據包都需要響應類型,我猜想的流量翻倍? – TechyAdam 2011-03-25 17:08:34

+0

@TechyAdam:你收集的「時間戳」越多,你的數據就越準確。當然,爲了收集統計數據而發送大量未使用的數據包並不是一個好主意。是的,當然一個數據包需要立即迴應纔有用。無論如何,它可能只是一個發送回客戶端的ack數據包,它只有一個小小的維度,只包含時間戳,數據包序列號和很少的數據。 – Heisenbug 2011-03-25 17:33:33

+0

@TechyAdam:但在回答你的問題時,我認爲你已經發送回客戶端某種UDP數據報,因爲UDP不可靠,所以你至少需要一些確認,以確保發送之前的數據包到達目的地。 – Heisenbug 2011-03-25 17:35:19

15

我會有客戶端時間戳輸出數據包,並有響應保留原始時間戳。通過這種方式,您可以計算往返延遲,同時避免因服務器和客戶端時鐘未完全同步而導致的任何問題。

+1

謝謝。時間同步正是我的問題。我的兩個Windows操作系統時鐘與互聯網時鐘同步,但由於某些原因,他們仍然關閉了大約3秒,所以我無法真正找到單向延遲。你的方式就像魅力一樣。 – 2014-07-05 23:09:18

0

如果您還沒有真正開始您的項目,請考慮使用像KryoNet這樣的網絡框架,該網絡框架具有RMI和高效的序列化,並且會使用UDP自動發送ping請求。您可以輕鬆獲得ping時間值。

0

如果您正在測量往返延遲,則時鐘漂移,HW時鐘精度和OS api等因素會影響您的測量。不用在硬件上花費金錢,您可以使用RDTSC指令獲得最接近的硬件。但RDTSC不會沒有它自己的問題,你必須小心你怎麼稱呼它。