情景假設:
a 客戶端傳送位置移動訊息(包括當前位置和當前速度),經過伺服器 s ,發到客戶端 b,因為網路延遲而造成客戶端 b 接收到訊息時,客戶端又移動了一定的距離,所以此時 b 客戶端從 a 傳送的位置開始按照a傳送的速度開始移動,這就出現了位置的不同步;解決方法:
我們只要在傳送資料時將 「傳送時間」 也加到傳送的訊息中,接收方接收到訊息時,就可以根據當前時間和傳送的時間的時間差知道此傳送方又移動了多少的距離,所以直接將位置移動到新的位置,在新的位置開始移動按照原先的速度開始移動,這樣就可以解決延時的問題。新問題:此時會出現新的問題,就是客戶端 a 和客戶端 b 的時間是不同步的,所以我們不能知道兩者的時間差是多少?
因為伺服器的時間是統一的,所以我們可以按照伺服器的時間來統一時間,具體方法如下:
獲得時間差:客戶端傳送當前時間 tc1 到 伺服器,伺服器當前的時間是ts,再講 ts 時間傳送到客戶端,此時客戶端的時間是tc2,所以得到客戶端的
傳送時間差 dt1 = ts - tc1
接收時間差 dt2 = ts - tc2
將這兩個資料儲存(必須隔一段時間更新一次,當然每次傳送位置資訊更新一次也是可以的,這個可以根據情況自己決定)
開始計算:設 a 客戶端的兩個時間差是 dta1 和 dta2 ,客戶端的兩個時間差分別是 dtb1 和 dtb2,a 在 t1 傳送訊息到伺服器 s ,此時伺服器時間是 t2,伺服器將訊息傳送到客戶端 b,理論上客戶端b的時間是 t3,滿足如下:
t2 - t1 = dta1
t2 - t3 = dtb2
==》t3 = dta1 - dtb2 + t1
但是 b 接收到訊息時,實際上 b 的時間是t4 ,即此時從 a 傳送資料到現在已經經過的時間dt是dt = t4 - t3
此時 a 又移動的距離是dx = dt * v(傳送的速度),所以將b的位置按照a位置拉扯多dx,再在新的位置按照接收的速度開始移動。
綜上所述:最終傳送的訊息包含的資料有 當前位置,速度,傳送時間差
這種條件下的判斷更加簡單,但是存在不合理的地方
客戶端在 t1 時刻傳送訊息到服務端,服務端將資料返回客戶端,客戶端接收到資料的時間是 t2,此時可以得到網路的時延是t2 - t1
,因為假設傳送的時延和接收的時延是相同的,所以可以知道傳送的時延是dt = (t2 - t1)/ 2
開始計算:設客戶端 a 的網路時延是dta , 客戶端 b 的網路時延是dtb , a 在 t1 傳送訊息,最終到達 b, b的時間是t3,可以知道這段時間經過網路延時造成的時間誤差是:dt = t3 - (dta + dtb)
,此時 a 又移動的距離是dx = dt * v(傳送的速度)
,所以將b的位置按照a位置拉扯多dx,再在新的位置按照接收的速度開始移動。
綜上所述:最終傳送的訊息包含的資料有 當前位置,速度,延遲時間
網路遊戲同步問題
介紹 作為乙個程式,你想過網路多人對戰遊戲是怎麼做出來的嗎?從外行的角度來看多人對戰遊戲是很神奇的 2個或者更多的玩家在同乙個時間經歷了相似的遊戲經歷,感覺他們就像在同乙個虛擬世界中遊戲一樣。但是作為程式設計師我們卻知道事實並不是他們想象的那樣的,他們看到的絕大多數其實都是假象。他們所認為玩家間同時...
網路遊戲同步問題
介紹 作為乙個程式,你想過網路多人對戰遊戲是怎麼做出來的嗎?從外行的角度來看多人對戰遊戲是很神奇的 2個或者更多的玩家在同乙個時間經歷了相似的遊戲經歷,感覺他們就像在同乙個虛擬世界中遊戲一樣。但是作為程式設計師我們卻知道事實並不是他們想象的那樣的,他們看到的絕大多數其實都是假象。他們所認為玩家間同時...
網路遊戲同步問題綜述
最近看了比較多的網路同步問題因為我只做過回合制,沒做過arpg,所以稍微去看看大致是怎麼實現的。基本上可以歸為兩個問題 玩家位置同步和戰鬥指令同步。玩家位置同步的情況要比戰鬥指令同步的情況簡單,不過正因為如此,你為了更好的同步,就會採取複雜的同步策略。另外,這兩種同步其實是息息相關的,戰鬥肯定會涉及...