C# 在线多人游戏基础

C# 在线多人游戏基础,c#,networking,real-time,C#,Networking,Real Time,我目前正在开发一款c#在线实时多人游戏。目的是使用UDP协议建立基于客户端/服务器的连接。到目前为止,我已经将UDP用于玩家移动,将TCP用于事件(玩家射击、玩家丧命),因为我需要确保这些数据将到达连接到服务器的所有玩家。我知道UDP被称为“不可靠”,有些数据包可能会丢失。但是我到处都读到,不要混合使用TCP和UDP,因为这会影响连接 主要问题是我应该如何组织我的网络 UDP是无连接的,我应该如何保存who's who?我应该在列表中保存客户端的ip地址吗 我应该对重要事件使用TCP还是使用UD

我目前正在开发一款c#在线实时多人游戏。目的是使用UDP协议建立基于客户端/服务器的连接。到目前为止,我已经将UDP用于玩家移动,将TCP用于事件(玩家射击、玩家丧命),因为我需要确保这些数据将到达连接到服务器的所有玩家。我知道UDP被称为“不可靠”,有些数据包可能会丢失。但是我到处都读到,不要混合使用TCP和UDP,因为这会影响连接

主要问题是我应该如何组织我的网络

UDP是无连接的,我应该如何保存who's who?我应该在列表中保存客户端的ip地址吗

我应该对重要事件使用TCP还是使用UDP?如果需要使用UDP,如何确保数据不会丢失


通过同时使用TCP和UDP,我需要将每个播放器的IP保存在一个列表(对于UDP)中,并将连接在另一个列表(对于UDP)中的TcpClient保存起来。我怎样才能更有效地改变这一点呢?

自早期游戏开发以来,连接得到了很大改善。在过去,UDP的速度优势使其成为非常理想的协议,甚至平衡了可靠性问题。然而,随着网络的改进,回避TCP的理由也消失了

我建议从两个协议中选择一个,然后继续。但主要是因为它将简化您的网络层,使调试网络问题变得更容易。当我不得不在TCP和UDP之间进行选择时,我会更多地决定我希望网络逻辑如何流动

对于基于UDP的系统,您确实需要自己做更多的簿记工作,但这还不足以将其纳入决策。UDP游戏的流程更像是所有碰巧共享同一个世界的独立单元。你不需要太多的被动逻辑(在他做了这件事之后,我就做了那件事),如果有什么事情被放弃或忘记了,游戏将继续顺利进行

TCP将给你更多的控制。这取决于API,可能需要更多的设置,但值得付出努力。TCP允许您与网络伙伴一起工作,就像您与同一CPU上的另一个线程一起工作一样。你所做的每件事都有一个开销,但听起来你已经让它工作了,所以不妨坚持下去


我通常倾向于自己,因为我认为这是根深蒂固的。此外,无论何时处理网络,您都必须针对未预料到的、丢失或延迟的数据包进行计划,UDP有助于将该消息带回家。如果您违反了这一规则,您会立即注意到使用UDP,可能不会使用TCP。

在我们的游戏开发堆栈交换中,这个问题可能会做得更好:投票关闭,但迁移到游戏开发。迁移后