问题引入:这里主要讨论状态同步,client A发生状态变化(移动,换装,属性变化等),将变化的信息同步到client B,最简单做法就是直接通过服务器中转然后广播出去,但是由于存在网络延迟,所以client B收到的消息总是滞后的,这对于高精度高技巧性的游戏的无法容忍的。
解决方式:首先要实现网络对时操作,所谓对时,并不是要求客户端时间跟服务器保持一致,而是通过在数据包中加入时间戳,算出数据包的网络延迟时间。首先客户端向服务器发送一个消息包,里面带上客户端的本地时间t1,服务器收到数据包打上服务器本地时间t2,服务器在内部流转该数据包可能会有时间消耗(比如一些逻辑处理,校正等),在服务器广播该数据包的时候打上服务器本地时间t3,客户端收到服务器广播的数据包时打上客户端本地时间t4。这里我们假设数据上下行的网络延迟是一样的。那么通过计算((t4-t1)-(t3-t2))/2, 就可以计算出单程一个网络包的大概延迟。