帧同步简单流程

概念:

服务器把所有的操作同步给所有的玩家,玩家在本地客户端根据服务器发过来的操作来推进游戏(同样的代码+同样的输入=同样的结果)

优点:实时性非常好
缺点:所有计算都放在客户端,容易作弊,跟单机没有太大的区别,不能同时同步的玩家太多,

服务器每隔一段时间,将采集的玩家的操作,发给所有的客户端,继续采集下一次的操作,等下一次时间到,又把采集到的操作发送给所有客户端

客户端:收到服务器的操作--------计算游戏逻辑—上报下一帧的操作给服务器

帧的次数:上限取决于网络传输时间,下限取决于用户体验流畅数目[10-20]

流程:

服务器:
(1) 服务器上每个玩家对象上声明一个frameId,保存当前比赛下一帧进入的id,初始为1
(2) 声明一个数据结构用来保存玩家每帧的操作,用来实现录像回放,断线重连,(UDP丢包时序时,补发给客户端),
(3) 声明一个下一帧的数据结构,服务器每帧收集的客户端的操作存放在这里
(4) 服务器启动定时器,每隔一帧的时间触发一次逻辑帧
(5) 触发这个帧操作时,保存当前帧的操作放入所有帧中去,
(6) 遍历每个玩家,给每个玩家发送这个帧操作
(7) 服务器进入下一帧
(8) 服务器开始采集下一帧,先清空上一帧的操作
(9) 发送“服务器认为”这个玩家还没有同步的帧,玩家对象中声明一个同步帧ID,记录了这个玩家已经同步到了多少帧,然后发送下一帧到最新的帧所有的数据,用来解决丢包和时序问题,补发帧
客户端:
(10) 客户端收到帧同步的的数据包后,执行对应的逻辑
(11) 每个客户端声明一个同步帧id,记录当前同步的帧
(12) 如果收到的帧小于客户端当前同步帧的id,丢弃这个帧(服务器会补发)
(13) 如果上一帧的操作不为空,那么这个时候,我们处理下一帧之前一定要先同步上一帧的结果。确保每帧都同步,处理下一帧之前,每帧都要同步
(14) 跳帧:快速的同步完过时的帧,直到最新的帧。比如:来了79-100帧的数据,遍历这些过时的帧,如果当前同步帧大于遍历帧,跳过这个遍历帧,如果遍历帧大于等于服务的最新帧,直接跳出循环。否则快速的执行这个未同步的帧
(15) 控制我们的客户端,根据最新的帧来执行相应的逻辑
(16) 采集自己的操作,上报给服务器,你认为的下一帧=当前的同步帧+1
服务器:
(17) 收到玩家的操作,更新服务器上认为玩家已经处理的帧id;如果服务器玩家对象的当前同步帧小于收到的帧-1,就更新这个同步帧
(18) 如果收到玩家操作的帧id不等于马上要触发的帧id,说明这是个过时的帧,服务器丢弃这个玩家帧
(19) 保存玩家的操作,等待下一帧的触发

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值