我正在开发一个UDP服务器端Android游戏,在那里我遇到了一些设计缺陷,让客户端保持同步。首先,一旦事件被触发,服务器就将游戏状态发送到游戏室中的每个连接的客户端。此广播使用可能语义,这意味着服务器无法检测客户端是否已收到状态。
保持客户端与服务器同步的高程序包丢失的当前解决方案是每个客户端每五秒钟向服务器发送一条ping消息,如果服务器检测到客户端上次ping消息的时间超过五秒钟,它将检查它是否连接到游戏室,如果是,则发送当前游戏状态。此解决方案不是非常可靠,因为它要求客户端丢失至少两条消息(收到的游戏状态+发送的ping消息)。
处理desyncs的另一种更可靠的方法是什么?我一直在研究逻辑时钟,并考虑在每个游戏室中实施一个计数器,在每个事件中递增,然后客户端可以将计数器包括在ping中。此解决方案的问题是客户端的ping消息体系结构很难重新实现以支持此功能。
答案 0 :(得分:3)
听起来你最终会在解决问题的过程中重新发明大部分TCP。我不确定你为什么首先选择UDP,但是如果可能的话,你可能会更好地使用普通的TCP套接字。