2009-09-11 140 views
31

我已經實現了一個服務器/客戶端體系結構,其中所有狀態更改都發送到該函數,驗證並廣播給所有連接的客戶端。這很有效,但系統並沒有保持遊戲的客戶端實例之間的同步。多人遊戲同步

如果在服務器和特定客戶端之間發生了5秒的延遲,那麼他將在剩餘客戶端5秒後收到狀態更改,從而導致遊戲狀態不同步。我一直在尋找各種方法來實現客戶端之間的同步系統,但迄今爲止還沒有發現。

我是網絡編程的新手,並不那麼天真地認爲我可以自己創造一個工作系統,而不用花費大量的時間。然而,我一直在想的是保持某種時間系統,因此每個狀態變化都會連接到遊戲中的特定時間戳。這樣,當一個客戶收到狀態改變時,它會準確地知道遊戲的哪個時期發生了改變,並且反過來能夠關聯滯後。這種方法存在的問題是,在那些時間滯後的遊戲中,客戶端會繼續遊戲,因此客戶端將不得不及時回滾以更新狀態更改,這肯定會變得混亂。

所以我正在尋找論文討論的主題或解決它的算法。也許我對整個多人遊戲系統的設計是有缺陷的,因爲客戶端的遊戲實例不應該更新,除非從服務器接收到概念。現在客戶只是在遊戲循環中更新自己,假設任何狀態都沒有改變。

+3

有趣的問題。 – Ian 2009-09-11 16:03:33

+0

我相信你應該重新考慮接受的答案。 Havenard對於今天使用的航位推算法或任何其他滯後技術一無所知。遊戲並非只是宣佈「落後的球員應該接受他們的狀況」;他們會努力隱藏延遲,以便讓遊戲更具可玩性。畢竟,如果我玩了一個遊戲,那裏的人們到處跳來跳去,我幾乎不能玩,我會很快離開那個遊戲。 – Ricket 2010-02-09 15:59:43

回答

16

對此的基本方法是所謂的Dead Reckoning和一個相當不錯的文章可以在這裏找到。基本上它是一個預測算法,用於在服務器更新之間的時間猜測實體位置。

在這個概念的基礎上有更先進的方法論,但這是一個很好的起點。


同樣的這是如何在源引擎處理(Valve的第一個半條命遊戲引擎),可以發現here的描述,其原理基本上是相同的 - 直到服務器告訴你,否則使用預測算法將實體沿着預期路徑移動 - 但本文處理了這種嘗試更深入地拍攝某些東西的效果。

2

您最好的選擇是從未來將更改發回客戶端,從而在相同時間點爲客戶端發送更改,而不會出現滯後問題。

+0

這是一個顯而易見的答案,但肯定會打開一個潛在的缺陷,有目的地瓶頸他們的機器,然後在刷新後加速它?有機會在任何其他人之前進行行動..? – Ian 2009-09-11 16:04:45

+3

將數據包及時發回是一個明顯的答案?哇... – Martin 2009-09-15 20:26:40

+0

Downvoted,答案沒有意義。 – CiscoIPPhone 2010-11-01 08:57:59

2

如果客戶看到事件的服務器是發生率餵它,這是正常的做法(我已經使用了Ultima Online,KalOnline和一些魔獸世界的協議),那麼這個瞬間5秒的延遲只會讓他接受這5秒的事件我會立即看到那些事件真的很快或者接近瞬間傳遞,因爲其他玩家如果他的輸出延遲也會看到他「很快行走」很短的距離。之後,一切都會正常流動。實際上,除了圖形和物理規範化之外,我看不到任何特殊的需求來使它正確同步,它只是同步自己。

如果你曾經在兩臺電腦附近玩過Valve遊戲,你會注意到他們並不在乎諸如「死亡的確切位置」或「屍體死亡的地方」等小細節。這完全取決於客戶端,完全受延遲影響,但這是無關緊要的。

畢竟,落後的球員必須接受他們的狀況,或關閉他們該死的eMule。

+0

所以你說我應該回顧我的客戶並重新更新遊戲的狀態?假設我有一名球員向南移動。他將繼續在所有客戶端計算機上執行此操作,而不會從服務器收到任何消息。如果他在某一時刻開始向北移動,那麼所有的客戶都會繼續向南移動,直到他們收到通知,一旦他們這樣做了,他們必須及時回去重新找回自己的位置,因爲他實際上不是一直向南移動。 由於時光倒流和重新評估是不可行的我想我可以發送球員絕對定位在特定的inteval – 2009-09-11 19:54:33

+0

這就是現在應該如何做。這種移動插值必須有一個限制,他會提前幾步,除非服務器插入關於他的移動的新信息。 – Havenard 2009-09-12 05:57:47

+0

在KalOnline中,它是由coordenate校正的,每一步他都會用X,Y和Z的3個有符號字節更新世界上的玩家xyz點。其他客戶端只是將模型位置插入到最終的xyz點。插值甚至不會隨着新的變化而跳過,它只是考慮從那時起的新的最終xyz。 – Havenard 2009-09-12 06:01:32

5

永遠不可能有辦法保證實時跨多個視點的完美同步 - 物理定律使它不可能實現。如果太陽現在爆炸了,你怎麼能保證阿爾法半人馬星座上的觀測者能夠在地球上同時看到超新星?信息需要時間旅行。因此,您的選擇是要麼準確地建模每件事物的準確度,以便查看者之間的延遲時間不同(或者您目前正在使用這種方式),或者在沒有延遲的情況下對其進行準確建模,並在觀衆之間進行大致同步(這是預測/推算/推算進來)。像實時戰略這樣的較慢的遊戲往往走第一條路線,更快的遊戲走第二條路線。

尤其是,您絕對不應該假設旅行所需的時間將保持不變。這意味着僅僅發送啓動和停止消息來移動實體在兩種模式下都是不夠的。您需要定期更新實際狀態(對於更快的遊戲,通常每秒更新幾次),以便收件人可以更正其預測和插值中的錯誤。