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

时间:2016-09-01 00:00:10

标签: unity3d websocket game-engine multiplayer

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

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

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

    1:有可能使用NTP时间并在两者之间同步吗?

    5点时间戳?这里的主要目的是为每个数据包加上时间戳

    7:根据客户端的不同延迟,输入的输入命令将不同步。我猜这个需要在应用之前进行排序吗?或者这有点过头了吗?

    在9:是lerp总是一个固定的金额?例如0.5f?我应该做一些更聪明的事吗?

    我知道很多问题,但任何帮助都会受到赞赏!!

1 个答案:

答案 0 :(得分:1)

在1:你有点过分思考,实际上你要做的就是将服务器时间发送到客户端,然后在更新循环中增加服务器时间,以确保你能够跟踪服务器时间。每次同步都会将您自己的值设置为来自服务器的值。对这部分非常谨慎,验证服务器端的每个速度/时间,否则你将获得非常容易做到但非常讨厌的黑客攻击。

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

7:可能是一个过度杀手,取决于比赛的类型。如果您的客户端具有较大的延迟,他们将根据定义向服务器发送较少的输入,因此请确保您只处理在处理点之前的那些输入并将剩余的队列排入下一次更新。

9:来自gamedev的This帖子可能会比我更好地回答这个问题,尤其是用户ggambett在底部发布的文字。