假设你想制作一款实时游戏,也许是一款2D自上而下的游戏。 你在游戏中要做的事情是保持简单:
但如果来自任何这些情况的数据报丢失,会发生什么? 你会做什么?
1)连接到服务器
如果您将UDP数据报发送到服务器,服务器将获取您的IP和端口,然后创建一个播放器 根据它为您提供的ID,以及每次收到您的数据报时它如何识别您。
但是,如果在“连接”(实际上不是连接,只是一个udp数据报,说“让我成为你的服务器的一部分”),这个初始数据报会丢失。如果在一段时间后没有收到服务器的回复,你是否会重新发送它是不对的?
2)移动玩家/攻击
如果我们随时移动播放器/按下移动键/攻击键,我们会发送击键 到服务器告诉它我们按下/释放了什么键。 然后,服务器会将此消息传递给所有其他客户端。
但是如果这个击键数据报丢失了怎么办?在客户端 - >服务器或服务器 - >客户端上。 因为击键一直在发生,所以一直重新发送它是否有效? 或者我们会忽略它在途中迷失的事实,因为如果你再次按一下键,它很可能会在下次再次使用它?
3)发送聊天消息
这将是必须到达服务器的东西。 如果它在途中丢失了,经过一段时间后如果我们没有收到对方/接收端的回复,我们会重新发送吗?
如果我们知道在一段时间后它没有达到,那么继续重新发送数据报是否可以? 而且,确认数据报是否成功发送了怎么办?
如果客户端向服务器发送聊天消息,并且服务器收到该消息,服务器是否应该向客户端发送回复以确认收到该消息?如果那个回复丢失会怎么样?那么呢?
答案 0 :(得分:1)
通常使用UDP的游戏在顶部有一个应用程序级协议,因此它们可以可靠地发送一些消息而不是其他消息。如果他们想要可靠地发送所有内容,那么最好使用TCP。然而,快节奏的游戏无法承受TCP引入的延迟,如果数据包确实丢失,重新发送它通常为时已晚!
实现可靠消息的一种方法是,像你想象的那样,发送一个ACKnowledgment回复,说明收到了这个特定的数据包 - 但是如果这个消息被丢弃你会问?可靠分组的发送方通常重新发送一定次数(例如3次),如果仍未接收到ACK,则发送方假定对等方已丢弃。
文章和游戏网络的绝佳位置,包括如何最小化发送的数据Shawn Hargreaves blog。 (这主要集中在C#XNA,但无论语言/框架/平台如何,都适用相同的逻辑。)
最后:
答案 1 :(得分:0)
如果数据报丢失,接收者就无法做到,因为他不知道。由发送方重新发送,由您来设计基于ACK或基于NACK的协议,以便接收方知道何时这样做。
答案 2 :(得分:0)
是否可以继续重新发送UDP数据报取决于服务器如何处理数据报中的数据。例如,如果您重新发送聊天消息,并且服务器同时收到原始消息和重新发送的消息,服务器是否会显示消息两次?请注意,即使收到原始邮件,您也可能最终重新发送,因为对原始邮件的回复可能已丢失或延迟。
最好的办法是使用TCP而不是UDP,因为TCP已经为您解决了所有这些问题。例如,“魔兽世界”开始使用TCP进行聊天,使用UDP进行游戏,然后最终转换为TCP。