网络游戏的帧同步与状态同步有啥区别?

      一般游戏网络同步分为帧同步和状态同步。对于这两种同步我看到网上很多人有不同的理解。
      1、如果按字面意思理解,帧同步设置了一个同步帧,把逻辑层和表现层完全分离。可是状态同步一样有同步帧呀!每一个同步帧同步一次状态。
      2、如果按照同步的内容来区分,帧同步同步的是指令,可以把帧同步称为指令同步。而状态同步同步的是状态数据。比如帧同步会同步"向前走"这个指令,而状态同步则同步玩家当前的位置坐标和是否在移动中的状态。问题来了,当我想发出"攻击"这个操作时,并没有什么需要计算和记录的状态数据,就是一条简单的攻击指令,状态同步还不是要跟帧同步一样乖乖地同步这条指令?有啥区别?
      3、大部分人都说帧同步是客户端把指令上报给服务器,而服务器把指令广播给所有客户端,客户端在本地自己计算操作结果。而状态同步也是客户端把指令上报给服务器,服务器根据指令计算好状态数据,然后把状态数据广播给所有客户端。问题又来了,状态同步中,客户端难道不可以自己计算状态数据,然后把状态数据发给服务器,服务器只进行广播吗?难道计算压力不在服务器就不叫做状态同步了?
      4、如果我每一个同步帧把类似"向前走"这样的指令发给服务器,服务器广播给所有客户端,所有客户端收到指令进行表现,因为同步帧的时间是固定的,速度是一致的,那么表现出来的位移"速度x时间"结果相同,这样是不是就叫帧同步?如果我每一个同步帧发送类似"x, y, z, isMoving=true"这样的消息给服务器,服务器广播给所有客户端,客户端根据这条消息去调整我的位置以及播放动画,因为表现帧要小于逻辑帧,所以为了防止出现瞬移的表现,可以进行平滑插值,在下一个逻辑帧到来之前把我的位置调整到(x, y, z)位置上就行,或者一开始就预计算,只是把逻辑帧的位置与预计算的位置进行对比,如果不一致就进行调整,这样算不算状态同步?
      状态同步的同步帧是可以存在的,比如客户端每0.1秒将自己的状态(或者操作指令)发给服务器,然后服务器进行计算,保存,并广播一次状态。而且无论状态是否改变,服务器都要把状态进行广播,因为客户端上存在预测算法,如果玩家这一帧静止,它的位置状态跟上一帧相比没有改变,但是其它客户端上会根据之前的速度进行预测位移,如果状态不变就不广播,其它客户端会一直预测并移动你的角色,而你的本地角色实际已经不动了。
      我个人认为帧同步和状态同步的区别,根源在于服务器如果保存有全地图所有非静态物体的状态数据,那它就是状态同步,如果状态数据小,可以客服端进行计算然后发给服务器保存并广播,如果状态数据大,客户端发给服务器的报文会很大,所以建议客户端发指令给服务器,然后服务器承担计算、保存、广播的压力。如果服务器没有保存非静态物体的状态信息,而是保存游戏开始每一个逻辑帧所有玩家的操作指令,那它就是帧同步。
      可以看到一般MMO游戏都使用状态同步,所以玩家加入游戏后会立马看到周围其它玩家的状态(位置、转向、动作、技能释放等),以及地图的状态(爆炸的箱子、正在移动的怪物)。这是因为服务器持有全地图所有非静态物体的状态,玩家新加入游戏,服务器把该玩家可见的地图范围内所有物体的状态发给它,让玩家迅速生成本地地图状态。
      而像MOBA类游戏,每一局比赛都创建一个房间,确定加入一局游戏的玩家,然后开始游戏,大家都有一个相同的游戏初始状态,接着帧同步开始起作用,所有客户端接收到一样的逻辑帧,执行一样的操作指令,那么所有客户端得到的地图表现就会同步。假如有玩家掉线,那么他重连的时候,会从游戏初始状态开始,把所有逻辑帧重新执行一遍,需要一会儿才能回到当前游戏状态。这是因为服务器保存所有逻辑帧的数据,而不是当然游戏状态的数据。
      至于状态同步机制到底有没有规定的同步帧,取决于你的设计,你可以设计没有同步帧,客户端有状态要改变时即时发送指令或者状态数据给服务器,服务器即时保存并广播。你也可以设计有同步帧,每一个同步帧采集一次客户端的状态信息,不管有没有状态改变都给服务器发送状态,然后保存广播。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值