网络同步
- 网络同步方案不是互斥的,可以混合使用。
同步方案的目标
同步信息模拟其他玩家
- 网络同步方案的目标一是在多人游戏中用最少的信息同步量来逼真地模拟其他玩家的一举一动,让我们在玩游戏的时候能看到其他玩家的位置、动作及状态。这里的关键词是“模拟”,本地设备中获取的信息由于网络因素通常都是延后的,如何通过这些延迟的信息来模拟真实角色的位移、动作、特效,是整个方案的关键。
确定同步的范围
- 不可能把所有玩家的状态都同步一遍,客户端和服务端都承载不了如此大的渲染压力和通信压力。所以需要通过某种方式确定同步信息的范围。
常见同步方案
同步方案 | 适合游戏类型 | 游戏 |
---|---|---|
状态同步 | MMORPG,FPS | 魔兽世界,吃鸡,传奇 |
实时广播同步 | MMORPG,FPS | 魔兽世界,吃鸡 |
帧同步 | MOBA | 王者荣耀 |
状态同步
- 状态即游戏角色的状态。为了能更逼真地模拟其他玩家的行为,把每个人的行为方式抽象成若干个状态。类似状态机,比如:攻击状态,追击状态,防御状态,奔跑状态,技能状态,寻路状态等等。客户端收到角色状态同步信息后,在一段时间内不需要其他信息就能模拟出这些角色的动作、位移及特效等。
- 这些状态都有一个共同的特点,就是只要我们给予所需的相同数据,就能展现出相同画面的个体效果。
- 整个状态同步过程中,服务端相当于幕后操纵者,客户端里的角色相当于木偶人。服务端通过发出指令控制客户端执行相关逻辑。
优点
- 状态同步能够控制数据计算的安全性。
- 能够保证所有客户端的同步性。
缺点
- 状态同步无法承受大量的数据。(位置和旋转的同步使用实时广播)
实时广播同步
- 状态同步不能满足实时模拟不同玩家在游戏场景中的位置与旋转角度,这些信息需要实时更新。
- 状态同步和实时广播同步经常同时存在,状态同步用于更新时效性不是很强的信息,实时广播用于同步时效性强的信息(位置,旋转等)。
- 客户端每秒向服务器发送15~30次自身的位置、旋转和数据,再由服务器分发给其他玩家。在其他玩家收到位置、旋转信息后,根据收到的信息预测其当前的位置、速度、加速度、旋转速度和旋转加速度,并进行模拟和展示。
服务器验证
- 实时广播一般要加上验证机制,不能让客户端为所欲为地决定自己的位置。
常见应用
- FPS - 玩家需要不停地移动自己的位置和朝向,以适应战斗的需要。
- 卡丁车 - 玩家要在高速移动的情况下不停地调整自己的方向和速度。
- MMORPG - 玩家需要不停的改变自己的速度和旋转角度让战斗显得更加丰富和灵活。
优点
- 能够实时预测模拟玩家的位置和速度。
缺点
- 放弃对玩家数据的强校验,才能顺利和准确的模拟其他玩家的位置和旋转角度。
帧同步
- 帧同步的逻辑不由客户端本身的逻辑帧Update决定,而是由网络收到的帧数据包驱动执行逻辑更新。 所有的逻辑更新都会放到收到帧数据包时的操作中,包括角色移动,攻击,释放技能等等。每当从服务器收到一个数据包,就会更新一帧或更新前面因延迟累积的帧数。
- 帧同步的服务器每秒向客户端发送15~30个帧数据包,即使没有任何信息,也会发送空帧数据包,因为客户端需要根据这些数据包演算游戏逻辑。
- 帧数据的集合可以认为是一条时间线,用帧代替秒计算时间,例如:某个动作做5帧而不是5秒,子弹飞行10帧而不是N秒。根据帧数据,可以演算整个游戏逻辑,称为可演算的。
- 帧同步使用[[定点数]]避免误差。
常见应用
- 适合同步性和安全性要求都很高的游戏,这些游戏每一帧都很关键,一两帧的计算就可能决定双方的胜负,所以不能有分毫之差。
- 王者荣耀,拳王等。
优点
- 能够做到移动和旋转的准确定位。
- 能够同步角色状态。
- 有比较强的同步校验。