2012-03-05 234 views
2

我正在開發一個簡單的快節奏2維實時多人在Flash遊戲。玩家只能射擊和走路點移動時尚。我使用TCP套接字連接(AS3不提供UDP)。遊戲網絡延遲補償

我只需要同步玩家的動作,讓玩家1在其屏幕上可以看到與玩家2,玩家3相同的東西,或者只是看到接近的表示(位置,受到傷害等)。

我知道運動矢量座標,我可以使用延遲方便地在它們上插值。 但是,我找不到一個有效的方法來確定有多少時間(T1)是否需要狀態更新來旅行client1-server-client2,然後根據T1更正客戶端2的屏幕。 (你知道,ping時間可能會波動很多)。

我需要一種方法來做到上述,我需要的方式是儘可能快和準確,但不是非常複雜。 (我應該使用什麼算法?什麼是解決方案 - 時間戳,可能或什麼? - 我不知道。)

+1

請參閱http://gamedev.stackexchange.com/questions/552/synchronizing-clients-with-a-server-and-with-each-other和http://gamedev.stackexchange.com/questions/6645/滯後補償與聯網-2D遊戲 – 2012-03-05 16:52:39

回答

4

首先,我認爲服務器應該不斷更新關於整個「世界」的信息。所有的客戶端都將他們的遊戲行爲(即玩家的行爲,如移動,射擊等)發送到服務器,並使用壓縮數據。

我會將「世界」劃分爲區域。每個玩家當然都有一個有限的觀點,所以他不能一次看到所有的世界(幸運的是),因此他只需要更新他所能看到的區域。

所以事情是:

  • 服務器生成的世界,並將其劃分成多個區域。
  • 當玩家進入這個世界,它得到了整個世界和地區的一般信息的詳細信息,在他面前
  • 有後果玩家的每個動作,必須被髮送到服務器(壓縮),取得信息。如果狀態變化具有改變一個或多個區域的影響,每個用戶有興趣在這些地區必須得到變更通知

它看起來像一個發佈/訂閱設計模式(觀察員),但

  • 每個客戶端都是發佈者,而服務器是用戶關注播放器狀態更改的用戶。
  • 服務器是發佈者,客戶是訂閱者,關注世界變化,但僅限於每個玩家感興趣的區域。這是一個特殊的Observer,訂閱隨着時間(地區)的變化而變化