我正在使用带有UDP的客户端 - 服务器模型制作游戏。以下是我到目前为止的实施方式:
我的困境是:如果一个"重要的"消息到达两次,我只想处理一次。但我怎么知道我已经收到了它,而没有在记忆中保留一个不断扩大的名单?
观
答案 0 :(得分:1)
为“重要”消息(从零开始)有一个单独的序列号,以及以下变量:
min_recv
,表示您收到了从0到min_recv
的所有“重要”消息(已排除); 在任何时候(例如,在收到另一个“重要”消息后),您将其序列号存储在列表中;然后你可以检查一下你是否可以压缩列表:
while list contains `min_recv`:
remove `min_recv` from list
increment min_recv
通过这种方式,您消耗的内存最少,因为即使您收到无序的重要消息(并且列表的大小也会开始增长),最终您将收到丢失的消息,因为如果它将被重新传输,丢了,你就会清空这个清单。
答案 1 :(得分:1)
使用#3。您正在确认重要消息的事实提供了确保按顺序接收它们的机制,即不确认无序消息,并且只记住您确认的最后一个消息的序列号。