实时多人服务器,插值和预测验证

real-time multiplayer server, interpolation and prediction validation

我正在为 Facebook 构建一个基于 HTML5 / Websockets 的多人 canvas 游戏,我已经在服务器代码上工作了几天。虽然游戏非常简单,2d 自上而下,WSAD 控制和鼠标点击向光标发射射弹 x/y - 我以前从来没有玩过实时多人游戏。我已经阅读了一些很棒的文档,但我希望我可以概述我对该主题的一般理解,并且有人可以验证该方法 and/or 指出需要改进的地方。

权威多人服务器,客户端预测和实体插值(及以下问题)

  1. 客户端连接到服务器
  2. 客户端同步时间到服务器
  3. 服务器有两个主要的更新循环:
    • 以每秒 30 次(滴答率?)的频率更新服务器上的游戏物理(或游戏状态)
    • 以每秒 10 次的频率向所有客户端广播游戏状态
  4. 客户端在允许移动之前存储了三个更新,这为更新状态之间的实体插值建立了缓存(在丢包的情况下从旧到新有一个冗余)
  5. 根据用户的输入,客户端以每秒 10 次的频率向服务器发送输入命令 - 这些输入命令带有客户端时间戳
  6. 客户端在屏幕上移动播放器以预测服务器将return作为客户端的最终(权威)位置
  7. 服务器在前面提到的更新循环中将所有更新应用于其物理/状态
  8. 服务器发送带有时间戳的世界更新。
  9. 客户端(如果晚于服务器时间&&队列中有更新)将旧位置线性插入到新位置。

问题

在 1: 是否可以使用 NTP 时间并在两者之间同步?

在 5: 时间戳?这里的主要目的是给每个数据包打上时间戳

在 7: 根据客户端的不同延迟,传入的输入命令将不同步。我猜这需要在应用之前进行排序?或者这是矫枉过正?

在 9: 线性插值总是固定的吗?例如0.5f?我应该做些更聪明的事情吗?

我知道很多问题,但如有任何帮助,我们将不胜感激!

在 1 :你有点想太多了,实际上你所要做的就是将服务器时间发送给客户端,然后在更新循环中增加它以确保你正在跟踪时间在服务器时间。每次同步时,您都将自己的值设置为来自服务器的值。对这部分要格外小心,验证每个 speed/time 服务器端,否则你会得到非常容易做但令人难以置信的黑客攻击。

在 5 处:当您通过 UDP 进行此通信时,时间戳很重要,因为除非您特别指定,否则无法确保数据包的顺序。通过 websockets 这应该不是什么大问题,但它仍然是一个很好的做法(但一定要验证这些时间戳,或者 speedhacks 确保)。

7 分:可能有点矫枉过正,具体取决于游戏类型。如果您的客户端有很大的滞后,根据定义,它们将向服务器发送较少的输入,因此请确保您只处理那些在处理点之前出现的输入,并将剩余的输入排队等待下一次更新。

在 9 处:This post from gamedev stackexchange might answer this better than I would, especially the text posted by user ggambett 在底部。