补充游戏思考13:游戏服务器杂谈(主要讲mmorpg,年更系列,未完待续10/20)

一、冒险岛状态同步数据的举例说明

1)基于帧的人物状态同步

  • 初始设计原因
    在开始设计的时候,没有考虑很多,为了简化操作,使用了基于帧的状态同步,在这种模式下,即当地图中玩家的状态发生改变,就立即往服务器发送一个状态数据包,然后通过服务器广播给当前地图中的所有玩家,其他的客户端收到该数据包后解析并设状态。这样的做的优势很明显,简单粗暴,同时状态信息准确。但是仔细分析之后,这样的做法增大了服务器的压力

  • 数据计算
    举个例子:
    ①在当前的游戏中,游戏的更新速率为 120 FPS,即一秒钟更新120次。如果玩家静止不动,则不需要发送数据包,但是如果玩家处于移动状态的时候,一秒钟会向服务器发送120个数据包,同时服务器需要广播(120*PlayerCount– 1)个数据包
    ②假设一个数据包的大小为10 bytes,一个地图有10个玩家(包括自己),那么服务器的带宽为12kbps ,十分消耗服务器性能。因此考虑在移动平台下,这种方式不可取。

2)基于预言的人物状态同步(插值计算)

  • 介绍
    由于每一次移动或者改变状态都需要发送数据包,消耗服务器性能。通过观察官方设计,使用基于预言的状态同步。

  • 实现前提
    可接受的延迟(RPG类游戏可接受200ms左右的延迟)

  • 官方冒险岛设计
    ①官方设计实际上实现的十分精巧,将一个 玩家/怪物 的移动拆分成了一个移动片段(MovementFragments),在每个片段中,包含了当前的位置,下一次的位置和时间。即

struct MovementFragments 
{
	Int16_t x;
	Int16_t y;
	Int16_t nextX;
	Int16_t nextY;
	Int16_t duration;
}

②在当前的客户端中,通过当前的位置(x,y),和当前的速度(speed),产生一个随机的时间duration (duration ∈(0,510)),通过这些参数算出移动过后的位置

nextX = x + speed * duration;
nextY = y + speed * duration;

③当其他客户端收到该数据包之后,通过数据包的值,算出玩家的速度,同时移动。
同时在官方的设计当中,一秒钟将一次状态改变拆分成了5次片段,片段的是消耗时间为一个随机值,但是总时间为510毫秒。因此在一次更新速度为120FPS的游戏当中,一秒钟只需要发送10个数据包,大大缓解了服务器的压力。

3)基于客户端的怪物状态同步

  • 概念介绍
    怪物的位置由第一个进入该地图的玩家决定
  • 原理
    当第一个玩家进入该地图之后,控制着当前地图中所有怪物的移动状态(这也就是为什么这么多吸怪了)。当第二个玩家进入该地图之后,第一个玩家会广播当前所有怪物的状态,第二个玩家根据这些数据包进行改变。当然其他玩家发生了攻击,或者激怒怪物的操作后,也会广播这个消息。
  • 补充
    同时怪物的移动也是采用基于预言的状态同步,大体实现和玩家移动相似。

4)基于服务器的怪物状态同步

服务器的状态同步原理很简单,服务器保存并控制着怪物的状态,因此当一个地图中有多个玩家的时候,广播当前的状态即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值