我正在开发一款多人网络乒乓游戏,这是我的第一款游戏。当前的状态是,我在服务器和客户端上使用相同的配置运行物理引擎。自己的桨运动被预测并得到权威服务器的确认。如果检测到它们之间的差异,我通过插值来纠正客户端的位置。对手桨在过去也被插入了200毫秒到100毫秒,因为服务器每100毫秒向每个客户端广播快照。
到目前为止,它工作得很好,但是现在我必须模拟球,并且在理解过程中有一个问题。
我已经多次阅读Valve关于快节奏多人游戏的文章,并理解了他们的方法。也许我可以把我的球和他们的子弹比较一下,但他们的优势是,子弹是看不见的。当我必须显示球时,看到我现在的球拍,过去的对手和介于两者之间的服务器,我如何在所有实例中同步球,并确保它被球拍击中,即使球拍快速移动?目前,我的球的位置只是由服务器更新设置的,所以它可以发生,球反弹回来,即使桨是一些像素之外(因为延迟的服务器位置)。到目前为止,我还没有在所有实例上同步时钟。每次更新时,我都会向服务器发送一个客户端步骤索引。如果服务器完成了它的工作,它将包含每个客户机的最后一步索引的快照发送回客户机。现在我正在查找返回的步骤索引处的存储位置并对它们进行比较。我需要一个普通的时钟来同步球吗?
编辑:
我已经尝试为服务器和所有客户端同步一个带有时间戳的公共时钟。但我认为最好使用自己的步进而不是时间戳(所以我不需要用ping等来计算-时间戳永远不会是精确的)。物理系统每秒运行60次,现在我用这个来保持它们同步。这是一个好方法吗?
当球被每个客户计算时,由于球拍的位置不同,反弹后的角度会有所不同(过去对手是200ms)。当服务器发送他的球的位置、速度和角度(因为他知道每个球拍的位置并且是权威的)时,由于反弹后的角度不同,球可能处于非常不同的位置(因为客户端在100ms后接收到服务器数据)。怎么可能插入如此巨大的差异呢?
当你在开发第一款游戏时,我认为你应该先尝试最简单但最有效的方法。然后你会体验到第一个令人兴奋的结果,然后你会有勇气去尝试更好的方法。
与Source Engine方法一样,在一边处理游戏,每隔1/30秒将每个对象状态发送给另一边。这是一个蛮力的方法,但它可以在局域网环境下工作。
现在您将发现延迟超过1/30秒的WAN环境中出现的问题。
我不确定它是否真的有效,但我认为:
- 假设球的运动不因球员的击球而改变。
- 只有当球员把球打到b点时,才发送球的位置P、速度和球员A的位置
- 在B处,接收它,但处理它,就好像时间L已经过去了(L= A和B之间的延迟时间* 2)。然而,渲染的球应该保持其先前的运动,直到它到达球的位置p。
值可以被伪装,即使它是时间值。:)