#yyds干货盘点# 网络游戏状态同步玩家移动
  PANeMkgDKlPI 2023年11月02日 84 0

状态同步是指对值(例如联网游戏对象上的脚本包含的整数、浮点数、字符串和布尔值)进行同步。

客户端将所有的操作发送给Server(T1),由Server计算(T2),并返回结果(T3)

状态同步服务架构能够防止很多的作弊,但是直接用这种方法会让游戏的响应变得迟缓。

如果 T1 + T2 + T3 非常大,则游戏体验会非常差。比如,客户端1释放了一个技能,1000ms 后才收到响应,这个游戏体验非常差。

所以状态同步服务器降低延迟是最重要的事情之一。

下面以任务移动为例子,讲解一下游戏状态同步问题

第一种方法deadreckoning

加入客户端1发生了移动,客户端将移动命令发送到服务器,然后服务器返回移动位置,理想情况下,可能需要100-200ms的延时,当延时大于100ms时体验就不太好,我点了移动要慢一会人物才会移动,这里就要讲讲一个deadreckoning算法,下文简称DR, DR提供了隐藏延时和减少带宽的方法。DR在本地模拟其他联网玩家状态(主要是位置信息),减少网络带宽消耗的同时尽可能的还原实际情况。 例子:

  1. 同一个场景2个玩家分别是A和B;
  2. 对于A,是否需要发送移动命令是通过阈值控制的。实际运动位置是P1,而DR算法模拟得到的运动位置是P1′,如果P1-P1′大于预先设置的阈值就发送移动命令到服务器。

  1. 服务器没有收到A的移动命令,需要模拟对方的运动,DR提供了几种经典算法:

(1)位置1 = 位置0,就是保持不变

(2)位置1 = 位置0 + 速度 × (T1 – T0),根据A的移动命令数据,做匀速运动

(3)位置1 = 位置0 + 速度 × (T1 – T0)+ 1/2 × 加速度 × (T1 –T0)平方,比2)中多了加速度的方向 在游戏中应用的比较多的是2)和3)。

第二种按固定帧间隔(如100ms)同步(流量消耗较大)

每帧上报一次位置、方向、速度。通过强制每帧只能改变方向一次,可以保持预测的准确性。此法要求更多的带宽,但是相比 DR,画面显示会更加的精确。客户端播放所有其它人的过去的精确位置,以及播放本地的最新位置,这将导致有100ms时差。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论