如何在网络乒乓球比赛中同步球?

时间:2014-06-19 09:05:26

标签: networking interpolation multiplayer prediction pong

我正在开发一款多人网络乒乓球游戏,这是我的第一款游戏。目前的状态是,我在服务器和客户端上运行具有相同配置的物理引擎。预测自己的桨叶运动,并由权威服务器确认。在它们之间检测到差异,我通过插值校正客户端的位置。对手球拍在过去也被插值200ms到100ms,因为服务器每100ms向每个客户端广播快照。

到目前为止,它的效果非常好,但现在我必须模拟球并且在理解程序时遇到问题。

我已经多次阅读过Valve(以及许多其他)关于快节奏多人游戏的文章,并了解他们的方法。也许我可以把我的球与他们的子弹比较,但他们的优点是,子弹是不可见的。当我必须展示球,并在当前看到我的球拍时,过去的对手和服务器介于它之间,我如何在所有实例上同步球并确保它被桨击中即使桨快速移动?目前我的球的位置只是通过服务器更新来设置,所以它可能发生,球反弹回来,即使桨距离一些像素(因为服务器位置延迟)。

到目前为止,我在所有实例上都没有同步时钟。我正在向服务器发送每次更新的客户端步骤索引。如果服务器完成了他的工作,他会将每个客户端的最后一步索引的快照发送回客户端。现在我正在寻找返回步骤索引处的存储位置并进行比较。我需要一个共同的时钟来同步球吗?

修改
我尝试为服务器和所有带有时间戳的客户端同步公共时钟。但我认为使用自己的步进而不是时间戳更好(所以我不需要用ping等计算 - 而且时间戳永远不会是精确的)。物理学每秒运行60次,现在我用它来保持它们同步。这是一个好方法吗?

当每个客户计算球时,弹跳后的角度可能因桨的不同位置而不同(对手过去是200ms)。当服务器发送他的球位置,速度和角度(因为他知道每个球拍的位置并且是权威的)时,球可能处于非常不同的位置,因为弹跳后角度不同(因为客户端接收到服务器数据) 100ms后)。如何插入这么大的差异呢?

1 个答案:

答案 0 :(得分:0)

在开发第一款游戏时,我认为你应该首先尝试最简单但是暴力的方法。然后你将体验到第一个令人兴奋的结果,然后你将获得勇气并尝试更好的方法。

与Source Engine方法类似,在一侧处理游戏,每隔1/30秒将每个对象状态发送到另一侧。这是一种粗暴的方法,但它适用于局域网环境。

现在,您将发现延迟超过1/30秒的WAN环境中出现的问题。

我不确定它是否真的有效,但我认为:

  1. 假设球的移动不会因球员的击球而改变。
  2. 仅在球员击球时向B发送球位置P,速度和球员A位置。
  3. 在B处,接收它但处理它就像时间L已经过去一样(L = A和B * 2之间的等待时间)但是,渲染球应该保持其先前的移动直到它到达球位置P。
  4. 从不受影响的值可以伪装,即使它是时间值。 :)