2011-05-25 83 views
7

我目前正在實時製作一個c#在線多人遊戲。目標是使用UDP協議進行基於客戶端/服務器的連接。到目前爲止,我已經使用UDP來進行玩家動作和TCP進行事件(玩家射擊,玩家失去生命),因爲我需要確保這些數據會到達連接到服務器的所有玩家。我知道UDP說'不可靠',有些數據包可能會丟失。但我已經到處閱讀,從不混合使用TCP和UDP,因爲它可能會影響連接。在線多人遊戲基礎知識

主要問題是我應該如何組織我的網絡?

UDP是無連接的,我應該如何保存誰是誰?我應該將客戶的IP地址保存在列表中嗎?

我應該使用TCP進行重要事件還是使用UDP?如果我需要使用UDP,我怎樣才能確保數據不會丟失?

通過使用TCP和UDP,我需要爲每個播放器保存它們的IP在列表中(對於UDP)和在另一個列表中連接的TcpClient(對於UDP)。我怎麼能改變這個更有效?

+8

這個問題在我們的遊戲開發堆棧交換中可能會做得更好:http://gamedev.stackexchange.com/ – 2011-05-25 17:07:56

+1

投票結束,但遷移到Game Dev。 – user7116 2011-05-25 17:18:48

+0

[link](http://gamedev.stackexchange.com/questions/12716/online-multiplayer-game-basics)post migrated – Lowip 2011-05-25 17:57:10

回答

1

自遊戲早期開發以來,連接已經有了很大的改進。過去,UDP的速度優勢使其成爲非常理想的協議,甚至可以平衡可靠性問題。然而隨着網絡的改進,避開TCP的原因已經消退。

我會建議選擇兩個協議中的一個並使用它。但主要是因爲它只會簡化您的網絡層,並且更容易調試網絡問題。當我必須在TCP和UDP之間選擇時,我會更多地決定如何讓我的網絡邏輯流動。

對於基於UDP的系統,您需要自己做更多的簿記工作,但這並不足以將其納入決策。一個UDP遊戲更像獨立單元,它們碰巧共享相同的世界。你不需要太多的反應邏輯(在他這樣做之後,我這樣做),如果有什麼東西被丟棄或忘記了,遊戲會繼續順利進行。

TCP會給你更多的控制權。取決於API,可能需要更多的設置,但是值得付出努力。 TCP可讓您使用聯網的合作伙伴,就像您將使用同一CPU上的另一個線程一樣。你做的每件事都有一個開銷,但聽起來你已經有了它,所以不妨堅持下去。

我一般都傾向於UDP,因爲它根深蒂固我認爲。此外,每當處理網絡時,您都必須爲不期望的,丟失或延遲的數據包做計劃,而UDP有助於將這條消息帶回家。如果違反該規則,您將立即注意到UDP,可能不會使用TCP。