2011-05-25 79 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。