位置同步策略

此思路参考的云风写的开发笔记
流程如下:

  1. 进入地图时做一次客户端和服务端的对时,以服务端为准,计算时间差,以后每隔一段时间(1分钟)对时一次。
  2. 客户端每隔一段时间(1秒),将当前运动状态(位置、速度、加速度)和时间戳T1同步到服务端。
  3. 服务端接到客户端同步后,立即推送给地图中的所有人的客户端。以下对于接收方是自己和其他人,

    两种情况分别讨论:

    1. 对于其他人,根据T1时刻的运动状态和当前本地时间T2,计算T2 + 1秒时刻的预测位置,反推当前的速度。
    2. 对于自己,根据T1时刻的运动状态和当前本地时间T2,计算当前时刻(T2)的预测位置,只要实际位置和预测位置相差不大,不用修正;否则直接移动到预测位置。

对于这套策略的总结如下:

  1. 以客户端的操作手感为先,服务端只做校验,防止作弊。这样对于自己来说,操作体验和单机无异;对于地图上显示的其他玩家,位置还原的精准程度取决于上述步骤2中同步的频率,理论上,频率越高则越精准,不过也会带来更高的网络和服务器开销,同时也要考虑游戏类型的实际需求,各方面因素综合考虑。
  2. 为了减小网络延迟的影响,采用对时和预测补偿的做法。对时是在进入地图的时候做一次,以后每隔1分钟再做一次,以防本地时间跳变带来的影响。预测补偿很重要,对于其他人的运动,我们总是预测1秒后的位置,再反推当前速度,为的是平滑处理,避免出现跳变。
  3. 保持一定的同步频率,还有一个好处是保持网络流量稳定,避免玩家在频繁操作时大量发包。例如,在带摇杆的游戏里玩家有可能会旋转摇杆在原地转圈,其实这种情况下其他玩家不用关心到那么细,只用保持一定采样频率即可。另外,就算客户端需要加入物理引擎也很方便,服务端不用做强验证,只要防止穿越地图这样的明显作弊即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章