如何更好的解决网络游戏的同步问题

在制作的一款坦克在线游戏中,由于网络同步会导致不同客户端表现的差异,该如何更好的解决呢?

1. 预期与实际表现差异

预期中的流程:

在理想情况下,客户端A看到B被敌方打死后,会立即发送死亡事件的消息给服务器,服务器再将该事件广播给其他客户端(包括客户端B)。接收到死亡消息的客户端B会执行死亡补间动画或状态变化,最终呈现出A和B两边的客户端都同步显示B已死亡。

流程如下:

  • A客户端 :看到B被敌人击中后,发送“B死亡”消息。
  • 服务器 :接收A的消息,广播死亡消息给B客户端。
  • B客户端 :收到死亡消息后,执行B的死亡动画或状态变化。
  • 所有客户端 :最终显示B死亡。

实际表现:

然而,实际情况中,常常出现一些不和谐的表现。客户端A可能会在合适的时间看到B死亡,并相应显示B死亡的动画,但客户端B却经历了不同的体验。在B的客户端中,B可能正在正常行驶,突然之间就被一颗新的子弹击中死亡,或者在未接收到死亡消息时,B的坦克会突然转向、拐弯等,看起来像是“跳跃”了,导致玩家感到不自然。这种差异往往会破坏玩家的沉浸感,导致影响游戏体验。

有没有更好的补间优化思路或者更好的解决玩家移动的同步问题呢?
以下是实际运行效果:
演示视频

不应该是死亡的判定都交给服务器吗?怎么会是A判断死亡了再传给服务器呢?
A接受服务器发的状态信息,显示当前信息
发送指令:朝B的位置发射子弹
服务器处理子弹移动,同时发给A和B显示子弹移动轨迹
服务器处理子弹命中,同时发给A和B显示子弹命中目标

这是联机游戏经常会遇到的问题,除非全部逻辑由服务器托管,否则没有百分百完美的办法。
1.【基于延迟的匹配】如果你使用了支持帧同步的物理引擎,那么这是一种比较简单的解决方案,服务器会以延迟高的玩家做为基础延迟参数,并在低延迟的客户端模拟延迟。比如A客户端延迟为200毫秒,b客户端延迟为500毫秒,那么经过处理后,两个客户端都必须以500毫秒来计算延迟。这样他们的行为在同一时间线上面可以保持最大效果的一致性。
2.【使用状态同步】将爆炸和子弹的逻辑分离,对于可预测的轨迹判断应该在胜利者这里判定,对于不可预测的轨迹判断应该在失败者哪里判定,举个例子,如果是一把枪,打出的直线射线,那么判定是否命中应该以开枪的玩家为准,这样可以避免明明打到了对手却没受到伤害的情况。如果是手雷这种轨迹不稳定的,应该以对手的判断为主,因为对手需要按照手雷的轨迹做出反应,比如躲避手雷。这种可以避免明明我已经躲起来了,结果手雷还是炸到了我。
3.【帧同步,预测和回滚】自己查教程,我没用过。

1赞