游戏中的一些同步问题。

同步问题

目前采用的有时间同步、帧同步和DR(dead reckoning)推算


在时间服务器算法中,由系统指定的时间服务器来发布全局的同一时间。各个玩家客户端根据全局的统一时钟来校对自己的本地时钟,达到各个玩家时间的一致性。

DR算法是一种推算模型,是一种客户端预测的方式,以减少网络游戏发送玩家状态的频率

关于帧同步,网上介绍的比较少,这里给一篇博文大家看一下帧同步的初解

时间同步

常见时间同步协议是SNTP,其流程是客户端向服务端发送消息,请求获取服务端当前的全局时间。服务端将其当前的时间发回给客户端,客户端将接收到的全局时钟加上传输过程中所消耗的时间值,和本地时钟做比较,若本地时钟值小,则加快本地时钟频率,反之,则减慢本地时钟频率。客户端和服务端之间消息传输所消耗的时间值可以通过在报文中携带物理时间进行RTT计算得到。时间服务器的算法原理简单,易于实现,但是由于网络延迟的不确定性,当对精确度要求比较高时,就没什么作用了。

NTP协议是在整个网络内发布精确时间的TCP/IP协议,是基于UDP传输的。提供了全面的机制用以访问标准时间和频率服务器,组成时间同步子网,并校正每一个加入子网的客户端的本地时钟。NTP协议有三种工作模式:C/S模式,客户端周期性的向服务器请求时间信息,然后客户端和服务器同步;主/被动对称模式,与C/S模式基本相同,区别在于客户端和服务端双方都可以相互同步;广播模式,没有同步的发起方,每个同步周期内,服务端向整个网络广播带有自己时间戳的消息包,目标节点接收到这些消息包后,根据时间戳来调整自己的时间。

DR同步大致过程

DR算法的基本思路如下:

假设在玩家A有一个小人(路人甲),开始移动了,就广播一次他的游戏信息给所有的玩家,包括:速度(S),方向(O),加速度(A)。所有的玩家收到A的游戏信息后,在各自的客户端开始模拟路人甲的运动轨迹和路线,包括玩家A本身,同时,路人甲在某玩家的控制下,会不时的改变一下方向,让其跑路的路线变得不是那么正规。在跑路的过程中,玩家A有一个值在不停的记录着其真实坐标和在后台模拟运动的坐标的差值,当差值大于极限误差的时候,则计算出当前的速度S,方向O和速度A,并广播给网络中其他所有节点。其他节点在收到这条消息之后,就可以用一些很平滑的移动把路人甲拉扯过去,然后重新调整模拟跑路的数据,让其继续在后台模拟跑路。DR算法通过运用当前以及过去的行为来预估将来的状态向量值。通常来讲,不同的应用需求,所采用的DR算法不同。目前广泛使用的DR算法主要有直线航位推测法和二次曲线航位推测法

总结:由于即将开发的为局域网游戏,所以采用DR算法比较合适。当然要改变一下dr算法的思路,可以在客户端产生一个操作,然后通知一下服务器,然后服务器广播到客户端,让各个玩家开始模拟,进行预测。

自己见解,不足,请改正。呵呵


原文地址:https://www.cnblogs.com/kanego/p/2180214.html