Synchronization 做好多人游戏/mmo客户端<&燃气轮机;服务器游戏在移动计算中使用延迟?

Synchronization 做好多人游戏/mmo客户端<&燃气轮机;服务器游戏在移动计算中使用延迟?,synchronization,latency,multiplayer,roundtrip,Synchronization,Latency,Multiplayer,Roundtrip,这里有几个问题 假设我有一个客户机,他将向服务器发送以下消息:“开始向前移动” 服务器不会立即收到此消息,因为延迟会导致延迟 问题1:ping(或更好的:)是客户端向服务器发送消息并接收响应所需的时间量。如果您可以忽略服务器注意到它已收到消息并开始发送响应所需的时间(这应该非常短),这是否意味着以下内容 客户端向服务器发送消息所需的时间=往返时间/2 服务器向客户端发送内容所需的时间=往返时间/2 因此,当客户机A发送该消息时,服务器将在客户机发送该消息后的往返时间/2毫秒内收到该消息。这就引出

这里有几个问题

假设我有一个客户机,他将向服务器发送以下消息:“开始向前移动”

服务器不会立即收到此消息,因为延迟会导致延迟

问题1:ping(或更好的:)是客户端向服务器发送消息并接收响应所需的时间量。如果您可以忽略服务器注意到它已收到消息并开始发送响应所需的时间(这应该非常短),这是否意味着以下内容

  • 客户端向服务器发送消息所需的时间=往返时间/2
  • 服务器向客户端发送内容所需的时间=往返时间/2
  • 因此,当客户机A发送该消息时,服务器将在客户机发送该消息后的往返时间/2毫秒内收到该消息。这就引出了下一个问题

    问题2:客户端是否应该首先发送包,然后等待往返时间/2毫秒,然后才实际执行客户端命令(在本例中为“向前移动”),以补偿延迟/延迟

    现在,服务器将向附近的所有玩家发送以下消息:“客户端A正在向前移动”。然后,这些客户机将确保客户机a的角色开始移动,这将引导我进入下一个问题

    问题3:接收到其他客户端已移动的消息的客户端是否应考虑到此消息是在往返时间/2毫秒前由服务器发送的?因此,用于移动计算时间戳的当前时间应减少往返时间/2


    在我看来,所有这些方法都将确保客户机之间的同步得到改善,因为考虑到了延迟。这是正确的做事方式吗?大多数其他好的多人游戏都能做到这一点吗?您有什么意见、建议、备选方案或随意但相关的叫喊吗?提前感谢。

    一些好的多人游戏使用一种机制,允许客户端决定玩家的位置并将其发送到服务器,从而允许玩家在往返时间很长的情况下平稳移动。有欺诈检查机制,但客户是免费的。因此,如果往返时间变得古怪,你会看到人们在你平稳移动的同时从一个地方跳到另一个地方。即使是一些MMO游戏,也允许客户端在未经服务器同意的情况下处理单人内容,从而将其带入下一阶段。只有统计数据、作战报告和一些其他信息与少量欺诈检查数据一起发送到服务器。

    我认为在大多数mmo中,除非出现严重延迟,否则您的客户端主要在不与服务器交互的情况下移动。服务器在客户端发送给服务器的消息的帮助下复制移动。例如,如果服务器延迟,客户端将停止接收来自服务器的反馈,并恢复到服务器确定的位置。这就是为什么在严重滞后时要向后跳几帧。这样,服务器也可以控制你的速度,这样你就不会被黑客攻击。如果您的客户端以超过服务器确定的速度的特定速率移动,您只需跳回额外的帧

    如果在一定时间内没有服务器的响应,其他客户端根本不允许您移动。这是您将经历“冻结滞后”的时间

    当然,也有这样的情况,服务器只是采取客户端发送的位置,盲目地信任它。这些游戏通常容易受到传送黑客的攻击

    当涉及到其他玩家的位置时,确实存在延迟,如果你使用两台计算机,连接到一个游戏(如魔兽世界)并同时移动这两个角色,就可以看到延迟。你会看到,在两台计算机上,非本地角色将在你真正开始移动他之后开始移动

    客户通常有某种滞后补偿。因此,如果另一个玩家正在朝某个方向移动,然后停止移动,您的客户端仍将模拟该玩家的移动,直到您收到来自服务器的消息,表明他改变了方向或停止移动。这就是为什么其他玩家在乒乓球高的时候可以来回跳跃。这也是为什么玩家在你触球时似乎只是滑倒/跑开/走开,然后在你的客户从服务器接收到位置时回到他们的真实位置

    当然,这会随着发动机的不同而变化,但这是一个相当普遍的说法


    编辑:忘记添加服务器也使用滞后补偿是很常见的。如果你在mmo中击中了在你范围内的某人,则从服务器视图来看,此人可能不在范围内。因此,服务器会为您的两个客户端计算延迟,并尝试匹配您是否真的在彼此的范围内。

    对于Q1:我觉得这很正确

    问题2:我过去这样做的方式是:如果你想让事情感觉有响应性,立即开始在客户端的模拟上执行动作,然后服务器在玩家发起动作时模拟前进。i、 e.客户端知道它在游戏模拟时间的几毫秒启动,因此服务器也可以在那个时候启动它(注意:这在时间上总是从服务器的当前刻度向后,所以你必须及时保存状态才能这样做)

    问题3:客户机只需要知道他们在时间X进行模拟,服务器说事件集{A,B,C}发生在时间{X,Y,Z}。然后,客户端和服务器可以使用相同的信息模拟转发,并且通常保持同步(同时发生冲突时除外)。在这些情况下,您需要服务器重新同步,因此您通常会在一个非常小的误差范围内结束,并获得一个大致平稳的体验

    如果你的目标是改善感知