我正在做一个快节奏的物理游戏,它是桌上曲棍球。有两个槌和一个冰球。游戏运行在iPhone / iPad上,我正在通过GameCenter做多人游戏。
这就是网络系统的工作方式。带有匹配标记的客户端将作为服务器进行结算,接受匹配请求的将是客户端。
“服务器”具有物理功能,响应是即时的,客户端也具有物理功能,因此在消息交换之间看起来很流畅。我作为服务器的工作是,我将客户的冰球速度和位置发送给客户端,客户端调整与服务器有关的冰球速度/位置以使其保持同步。否则,物理场将失去同步,并且将其拧紧。
当网络延迟很好,在100毫秒以下时,效果很好,我在客户端获得了流畅的可玩游戏,并且怪异的行为降到了最低。当滞后时间约为150到200毫秒时,就会发生此问题。在那种情况下,发生了我的客户冰球已经碰到边缘和反向的情况,但是它收到了来自服务器的延迟消息,并且它后退了一点,从而引起了对球行为的怪异感觉。
我已经阅读了一些有关它的内容:
那么,我该如何解决呢?据我所知,最好的选择是使用时间戳在服务器/客户端上进行时钟同步,这样当我收到与时钟相关的延迟消息时,我就忽略了,然后让客户端模拟执行工作。你们同意吗?而且由于我发送的数据不可靠(UDP),所以我可能会收到延迟的消息或混乱的消息。
如果那是最好的方法,我如何实现时钟同步。我已经阅读了有关如何操作的步骤,但我不太了解。
它说:
- 客户端在“时间请求”数据包上标记当前本地时间,然后发送给服务器。
- 服务器收到后,服务器会在服务器上盖章并返回
- 客户端收到后,客户端从发送时间中减去当前时间,然后除以2以计算延迟。它从服务器时间中减去当前时间,以确定客户端-服务器时间增量,并加上半延迟以获取正确的时钟增量。(到目前为止,此algothim与SNTP非常相似)
- 客户重复步骤1至3五次或更多次,每次都暂停几秒钟。在此期间可能允许其他流量,但应将其最小化,以获取最佳结果。数据包接收的结果将被累积,并以最低延迟到最高延迟的顺序进行排序。中值等待时间是通过从此有序列表中选择中点样本来确定的。
- 丢弃与中位数相差大约1个标准偏差的所有样本,并使用算术平均值对其余样本取平均值。
按照这个例子,我会有这个:
让我们假装游戏已经加载并且我的客户端时间现在是0,所以我向服务器发送我的时间是0。
消息需要150毫秒才能到达服务器,但是服务器的时钟已经启动,并且比客户端提前1秒。服务器收到消息后,时间将是:1.15并将该时间发送给客户端,我们还好吗?假设我们的滞后时间恒定为150ms。
现在客户端接收时间1.15,并从发送的时间中减去当前时间,然后除以2以计算延迟。Wich为:0.3-0 = 0.3 / 2-> 150ms。
它从服务器时间中减去当前时间以确定客户端-服务器时间增量,并添加半延迟以获取正确的时钟增量:
客户端时间:0.3服务器时间1.15
0.3-1.15 = .85 +等待时间(.15)= 1
如何同步?我想念什么?
这是我第一次玩多人游戏和网络游戏,所以我有点困惑。
谢谢。