2011-08-20 29 views
5

我正在研究項目以瞭解node.js,並正在尋找一些關於如何處理實時同步用戶數據的建議。假設你有一個二維矩形地圖(大約600x400),其中有多個玩家佔據該地圖上的x,y位置。每個用戶都可以使用箭頭鍵進行導航,並以某種基本方式與其他人進行交互。鑑於這將通過HTTP進行播放,在處理和同步用戶數據以提供最流暢,最快速的體驗方面,最好的設計模式是什麼?實時同步在線遊戲中的多用戶數據的設計模式建議

我能想到的幾個選項,但希望得到一些更多的想法/澄清:

  1. 客戶端的位置數據發送到服務器,服務器分發的所有位置的所有客戶端,屏幕上呈現與結果。重複。不利的一面是客戶端的數據往返時間滯後,但好處是它們與所有用戶同步。

  2. 客戶端呈現它認爲它經常發生的位置數據發送到服務器,服務器將所有位置分發給所有客戶端,然後使用服務器數據更正來自客戶端數據的屏幕呈現。上行是一個較爲快速的反應,下行是輕微的同步損失。

  3. 這兩者的混合,但不是使用(x,y)座標,而是使用[先前的x/y和時間,當前的x/y和時間,在時間間隔建議的x/y ]然後可以用來繪製不斷變換的拋射路徑。看起來這樣實施會很棘手。

任何指針?

+0

使用socket.io進行通訊 – Alfred

回答

5

大多數遊戲使用某種形式的航位推算法http://en.wikipedia.org/wiki/Dead_reckoning,它允許從服務器分發延遲更新,但保留了客戶端實時更新的一些幻覺。

最好的選擇是3.它不是特別複雜 - 只是跟蹤你期望每個演員是基於遊戲機制的,並且當你從服務器收到更新時,你會隨着時間的推移使兩個狀態一致。

如果您發現服務器向您發送的狀態與您的客戶端所處的狀態相距太遠(太遠需要定義),那麼您可以跳轉到服務器狀態並接受客戶端上的不連續點。

+0

是的,我會這樣做。根據您的數據傳輸格式,不連續性很少會引起注意。請告訴我你正在使用套接字而不是輪詢... – landons

+0

即使你使用的是socket.io,你依賴於對大多數用戶的輪詢,websockets只能在少數瀏覽器atm上啓用。 –

+0

@Ricardo:通過使用Websockets(http://caniuse.com/websockets)和服務器發送的事件(http://caniuse.com/eventsource),他將能夠在沒有輪詢的情況下將數據推送到大多數客戶端 - 只有IE用戶將不得不使用輪詢。 –