如何处理游戏中丢失的移动 RPC 数据包?

How to handle dropped movement RPC packets in games?

我想知道我应该如何处理游戏中 RPC 数据包的数据包丢失。 例如,如果客户端正在向前移动,但过了一会儿开始向左扫射,但是向左扫射的 RPC(MovingLeft) 由于丢包而被丢弃。 服务器仍然会认为玩家在前进,但客户端预测会让玩家在按下'A'键后立即扫射离开。

您是否应该让客户端在过去的一段时间内覆盖服务器权限?如果客户端正在修改服务器上的过去状态,这将如何影响服务器模拟?

大多数游戏都这样做,它们会在本地接受命令并呈现它们,就好像服务器收到它们一样,然后由开发人员决定如何解决任何差异。

这是 "rubberbanding" 在游戏中客户端呈现用户向左移动,但随后角色模型跳回 "should" 根据服务的位置的主要原因。

您可以考虑的其他事情不是简单地一次用一个动作调用您的服务器,而是用带有时间戳的最近 3-5 个动作调用您的服务器,即。

  • 操作:转发 [0 - 1 秒] -> 服务器收到
  • 操作:向前 [0 - 1 秒],向左 [1 - 2 秒] -> 丢弃数据包
  • 操作:向前 [0 - 1 秒],向左 [1 - 2 秒],向前 [2 - 3 秒] -> 服务器收到

您应该做的另一件事是不断更新您的服务器,无论是否执行了 "new" 操作:

  • 操作:前进 [0 - 1 秒]
  • 动作:向前 [0 - 1 秒],向左 [1 - 2 秒]
  • 动作:向前 [0 - 1 秒],向左 [1 - 3 秒]