我正在开发一款多人网络乒乓球游戏,这是我的第一款游戏。目前的状态是,我在服务器和客户端上运行具有相同配置的物理引擎。预测自己的桨叶运动,并由权威服务器确认。在它们之间检测到差异,我通过插值校正客户端的位置。对手球拍在过去也被插值200ms到100ms,因为服务器每100ms向每个客户端广播快照。
到目前为止,它的效果非常好,但现在我必须模拟球并且在理解程序时遇到问题。
我已经多次阅读过Valve(以及许多其他)关于快节奏多人游戏的文章,并了解他们的方法。也许我可以把我的球与他们的子弹比较,但他们的优点是,子弹是不可见的。当我必须展示球,并在当前看到我的球拍时,过去的对手和服务器介于它之间,我如何在所有实例上同步球并确保它被桨击中即使桨快速移动?目前我的球的位置只是通过服务器更新来设置,所以它可能发生,球反弹回来,即使桨距离一些像素(因为服务器位置延迟)。
到目前为止,我在所有实例上都没有同步时钟。我正在向服务器发送每次更新的客户端步骤索引。如果服务器完成了他的工作,他会将每个客户端的最后一步索引的快照发送回客户端。现在我正在寻找返回步骤索引处的存储位置并进行比较。我需要一个共同的时钟来同步球吗?
修改
我尝试为服务器和所有带有时间戳的客户端同步公共时钟。但我认为使用自己的步进而不是时间戳更好(所以我不需要用ping等计算 - 而且时间戳永远不会是精确的)。物理学每秒运行60次,现在我用它来保持它们同步。这是一个好方法吗?
当每个客户计算球时,弹跳后的角度可能因桨的不同位置而不同(对手过去是200ms)。当服务器发送他的球位置,速度和角度(因为他知道每个球拍的位置并且是权威的)时,球可能处于非常不同的位置,因为弹跳后角度不同(因为客户端接收到服务器数据) 100ms后)。如何插入这么大的差异呢?
答案 0 :(得分:0)
在开发第一款游戏时,我认为你应该首先尝试最简单但是暴力的方法。然后你将体验到第一个令人兴奋的结果,然后你将获得勇气并尝试更好的方法。
与Source Engine方法类似,在一侧处理游戏,每隔1/30秒将每个对象状态发送到另一侧。这是一种粗暴的方法,但它适用于局域网环境。
现在,您将发现延迟超过1/30秒的WAN环境中出现的问题。
我不确定它是否真的有效,但我认为:
从不受影响的值可以伪装,即使它是时间值。 :)