实时多人游戏延迟补偿技术

简单地说,我正在开发一个实时多人游戏。在我的游戏中,客户端以20赫兹的频率向服务器发送更新的位置和速度数据。在下面的示例代码中,我正在使用LuaJIT FFI将数据从Lua表格转换为C结构体。这是一种非常棒的在网络上传输数据的方法:

当服务器接收到数据包时,它尝试调整数据以补偿该特定客户端与其自身之间的延迟:

一旦数据被规范化,它就将更新后的位置信息广播给所有其他客户端:

当其他客户端最终收到数据包时,它们根据与服务器的延迟调整数据:

所以问题在于:对象非常抖动。每次我收到一个数据包,其他玩家都会向前或向后移动一点,所以似乎我的延迟补偿不正确,这使得我的插值也不正确。也许有人能指出我代码中的一些明显的缺陷,或者是我对于这个过程的理解有偏差?

点赞
用户4402825
用户4402825

为了保证流畅的动画效果,服务器端的位置更新应该在固定的时钟上,使用当前存储的位置/速度向量。

当接收到客户端更新时,您需要进行两个计算来计算下一个计时:

  • 首先,使用客户端的向量,找到玩家在下一个计时中应该的位置。
  • 接着,计算一个新的向量,使服务器端玩家达到该位置,并使用该值来更新服务器速度。

服务器将在下一个计时中以非常统一的方式更新所有客户端的位置。您可以通过将2个或以上的计时向前投影来进一步平滑方向变化。尝试补偿延迟时的目标实际上只是要落在可接受的误差范围内。

2015-02-04 05:48:54