【问题标题】:UDP vs TCP for non-frequent input based game基于非频繁输入的游戏的 UDP 与 TCP
【发布时间】:2014-12-08 07:06:40
【问题描述】:
我正在阅读关于网络编程的关于 gafferon 的文章,它解释了 UDP 与 TCP 的优缺点。
但是,感觉这只适用于需要持续输入流的游戏。我正在开发一款纸牌游戏,我想知道创建多人游戏功能的最有效方法是 UDP 还是 TCP。我觉得 UDP 可能仍然是其速度的最佳选择,但这引发了更多问题。
如果我使用 UDP,在数据包丢失的可能性很小的情况下,我如何知道它已丢失以及如何从丢失中恢复?
【问题讨论】:
标签:
network-programming
multiplayer
【解决方案1】:
如何检测消息丢失?
接收者需要向原始发送者发送一些东西,告诉他它收到了消息。如果原始发件人在定义的时间范围内没有收到确认,它将重新发送消息。
另一种方法是在默认情况下多次发送每条消息,并让接收者忽略重复。
此规则可能会变得任意复杂,最终您将重新实现部分 TCP。您可能还想确保消息的顺序。
UDP 适用于频繁更新,在这种情况下丢失一些消息也不错(例如,传送视频流或在第一人称射击游戏中保持玩家位置同步)。纸牌游戏节奏较慢,但需要可靠、有序的消息。如果您不打算与数千名玩家一起主持游戏会话,请使用 TCP。它足够快,而且更容易使用。
它只适用于恒定的输入流?
即使您每分钟只发送一条消息,TCP 也能正常工作。术语“面向流”基本上意味着接收者不知道消息在哪里结束。例如,您必须在您的协议中通过添加消息长度来提供该信息。
如果您选择 UDP,最好在其上使用库。