【问题标题】:Online Multiplayer Game Basics [closed]在线多人游戏基础[关闭]
【发布时间】:2011-05-25 17:03:50
【问题描述】:

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

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

UDP是无连接的,我应该如何保存谁是谁?我应该将客户端的 IP 地址保存在列表中吗?

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

通过同时使用 TCP 和 UDP,我需要将每个玩家的 IP 保存在一个列表中(对于 UDP)和连接在另一个列表中的 TcpClient(对于 UDP)。我怎样才能改变它以更有效?

【问题讨论】:

  • 这个问题在我们的游戏开发堆栈交换中可能会做得更好:gamedev.stackexchange.com
  • 投票关闭,但迁移到游戏开发。
  • link 帖子已迁移

标签: c# networking real-time


【解决方案1】:

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

我建议选择两种协议之一并使用它。但主要是因为它只会简化您的网络层并使调试网络问题变得更容易。当我必须在 TCP 和 UDP 之间进行选择时,我会更多地决定我希望我的网络逻辑如何流动。

对于基于 UDP 的系统,您确实需要自己做更多的簿记工作,但这还不足以将其作为决策因素。 UDP 游戏的流动更像是碰巧共享同一个世界的独立单元。你不想要很多反应性逻辑(在他这样做之后,我这样做),如果某些东西被丢弃或忘记,游戏将继续顺利进行。

TCP 会给你更多的控制权。取决于 API,可能涉及更多设置,但值得付出努力。 TCP 允许您与网络伙伴一起工作,就像您在同一个 CPU 上与另一个线程一起工作一样。您所做的一切都会产生开销,但听起来您已经可以使用它,所以不妨坚持下去。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多