Go游戏服务器开发的一些思考(三十八):MMO游戏移动同步

时间:2022-09-14 20:43:43

MMO游戏移动同步

MMO游戏与IO游戏的不同:

类型 视野内人数 交互性强弱
MMO游戏 多,大到几百人 相对弱
IO游戏 少到一定范围,如最多10、20人等

因此,会采取不同的策略,来做移动同步。

类型 策略
MMO游戏 需要控制流量,放缓同步间隔间隔
IO游戏 可以牺牲可接受的流量,适当频繁同步

本文下面,针对MMO游戏,提供一种移动同步方案。

本方案,综合参考了一些典型的 IO游戏移动同步、MOBA游戏移动同步。

同步的信息

服务器会向客户端发送同步信息

  • 位置XYZ
  • 状态
  • 朝向XYZ (与锁定目标互斥。)
  • 锁定目标(与朝向互斥。值为游戏对象ID)

客户端移动机制

  1. 客户端只有在下列情况向服务器发送移动事件

    • 玩家开始移动
    • 玩家停止移动
    • 玩家改变方向
    • 玩家改变速度
  2. 客户端收到服务器的同步信息,才会移动

  3. 客户端朝最新的同步信息,做平滑追赶

服务器移动机制

  1. 服务器每帧更新移动状态
  2. 服务器收到客户端移动事件,都会向客户端(s)发送同步信息
  3. 服务器逻辑触发端移动事件,都会向客户端(s)发送同步信息
  4. 除特殊情况下,服务器每1秒向客户端(s)发送同步信息(针对移动中的客户端)
  5. 客户端处于静止状态,服务器不会定时向客户端(s)发送同步信息
  6. 如果是玩家改变方向、改变速度,则服务器持续3次每100ms向客户端(s)发送同步信息

服务器端3D建模的场景移动算法

前提条件:

  • 已3D建模
  • 能射线检查
  • 有高度图

服务器每帧更新移动状态,假设某帧,从(x0, y0)点移到(x1, y1)点

可以按以下步骤完成目的点是否可行走:

  1. 通过高度图,可以得到完整坐标从(x0, y0, z0)点移到(x1, y1, z1)点
  2. 射线检查(x0, y0, z0+H) - (x1, y1, z1+H)间有无障碍物。

    H值可以硬编码,射线检测要高点,不然沿着地面在做射线检测

  3. 检查 (x0, y0, z0) 、(x1, y1, z1)2点的z值高度差
  4. 只有无障碍物、z值高度差在一定范围: [-a, b]内,则可行走

以上

使用UDP包发送同步信息

由于MMO游戏的场景服务器,通常在网关服务器后面。

是否可以使用UDP包发送同步信息,待考擦。