2012-02-21 65 views
3

我正在嘗試寫一個小型在線瓷磚遊戲。我已經建立了一個遊戲 - 服務器與套接字的連接,所以我可以輕鬆地將字符串從客戶端發送到服務器,反之亦然。Java MMO遊戲數據傳輸

我不明白,我應該以什麼樣的形式存儲數據才能夠有效地傳輸它?我應該使用數據對象,序列化併發送它?我應該將數據存儲在一個長字符串中嗎?還是有另一種方式?

如果它的事項是什麼樣的數據,我會送,這將是其他玩家,地圖對象等

現在我已經瀏覽了幾天,仍然沒有結果的信息(可能是因爲我不確定這個問題是如何被調用的)。

謝謝!

回答

4

這裏最重要的是這個:它是一個基於回合的遊戲嗎?

對於基於回合的遊戲,您可以使用TCP套接字並在套接字上傳輸完整的遊戲狀態(或基於前一個遊戲狀態的增量)。甚至沒有關係如何編碼。

對於實時遊戲,重要的是嘗試儘可能經常更新狀態。數據包丟失並不重要;也許另一個數據包仍在傳輸中,它會覆蓋先前的數據包。這就是爲什麼你應該使用UDP套接字而不是TCP。

考慮到您正在討論基於瓦片的遊戲,請考慮需要向客戶傳達什麼信息。也許只有球員會移動,而其他球員是靜止的?

這是一個難以解決的問題,不允許有一個確鑿的答案。有很多設計決策需要考慮,包括主遊戲模擬循環的設計,作弊,網絡架構測試等。請參閱https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking,以獲取您所面臨問題的一​​個小例子。

最簡單的解決方案,我可以給你的是:

  • 使用TCP套接字,這樣你就不必處理數據包丟失。
  • 當服務器上的遊戲狀態發生變化時,將狀態傳播給所有客戶端。在不佔用大量空間的地方做到這一點。一個例子是如下ENTITY NUMBER - NEW POSITION來傳送小包。 (即兩個32位整數)。當您需要一次傳送多個更新時,請確保它們包含在同一個TCP數據包中,並且TCP發送緩衝區在兩端都立即刷新。
  • 忘記所有時間問題,您將面對與400ms及以後的往返(平)時間與客戶打交道。如果需要,您可以像這樣轉換數據包:ENTITY NUMBER - NEW POSITION - CURRENT SPEED VECTOR這將允許客戶端估計實體位置,包括滯後延遲。
0

這取決於你。您可以使用字符串,序列化或將數據打包到ByteBuffer並通過網絡發送。選擇最適合你的方式。但是我認爲ByteBuffer是最有效的。

我推薦Netty庫,因爲它大大簡化了套接字處理。