做好多人/ MMO客户端<>服务器游戏使用移动计算中的延迟时间?(Do good mul

2019-08-08 01:21发布

有一对夫妇的问题在这里。

想象一下,我有谁去将下列消息发送到服务器的客户A:“开始向前移动”。

服务器将不会立即收到此消息,因为有因为等待时间的延迟。

问题1:平(或更好: 往返时间 )是花费的时间为客户端将消息发送到服务器并接收返回的响应的量。 这是否意味着以下,如果你可以忽略它需要服务器来发现它已经收到了消息,并开始发送响应的时间(这应该是很短的)?

  1. 花费时间的客户端发送到成才服务器=往返时间/ 2
  2. 它需要对服务器时间送东西给客户端=往返时间/ 2

所以,当客户端A发送一个消息,服务器将理应收到消息往返时间/ 2毫秒后的客户端发送消息。 这使我的下一个问题。

问题2:应在客户端首先发送的包,然后等待往返时间实际执行该命令的客户端(在这种情况下:向前)前/ 2毫秒的延迟补偿/滞后?

现在,服务器会发送以下信息给所有附近玩家:“客户端正在前进”。 然后,这些客户将确保客户端的角色开始移动,这使我的下一个问题。

问题3:在客户机接收的其他客户已经移至考虑到这一消息是由服务器往返时间/ 2毫秒前发送邮件? 使得用于移动计算的时间戳当前时间应由往返时间/ 2被降低?

所有这些方法都将在我的脑海确保同步客户端之间的改善,如延迟考虑在内。 这是做事的正确方法吗? 大多数其他好的多人游戏这样做呢? 任何意见,建议,方案或随机的,但相关的喊叫声,你想给? 提前致谢。

Answer 1:

我认为,在大多数网络游戏的客户端,除非坏滞后主要发生移动而不互动与服务器。 服务器再现与客户端向服务器发送消息的帮助下移动。 因此,如果例如服务器滞后,客户端将停止从服务器recieving反馈和回复到服务器确定您所在的位置。 这就是为什么你不好的滞后期间跳回几帧。 通过这种方式,服务器也将有超过你的速度控制,使你不speedhacking。 如果您的客户端移动以一定的速率是在由服务器确定的速度,你会简单地跳回额外的帧。

其他客户端不会让你动弹没有一定量的时间内,来自服务器的响应。 这是你将体验“冷冻滞后”的时代。

当然也有OCCURENCES所在服务器简单地采取客户端发送位置和盲目信任它。 这些是通常容易受到黑客瞬移游戏。

当涉及到其他球员的位置确实有一个延迟,可如果你把两台电脑中可以看出,连接到游戏如WOW和同时放移动两个字符。 你会看到,两台计算机的非本地字符将开始移动你真的开始移动他后。

客户通常有某种滞后补偿。 因此,如果其他玩家在某个方向移动,然后停止,您的客户将仍然模拟该选手的运动,直到你收到来自他改变了方向或采空移动服务器的消息。 这就是为什么其他玩家可以来回跳转时,平高。 这也是为什么玩家似乎只是滑动/运行/走开当你打lagspikes,然后返回到他们的实际位置,当你的客户收到来自服务器的位置。

当然,这种改变来自发动机引擎,但它是一个相当普遍的形式给出。

编辑:忘了补充,这是很常见的服务器也使用滞后补偿。 如果你在一个网络游戏就是在你的范围内打的人,这个人可能不会在范围内的服务器查看。 因此,服务器会为您的客户的等待时间,并试图匹配,如果你的海誓山盟与否范围真的。



Answer 2:

这是一个老问题,但我最近制定了类似的代码,所以也许这将帮助别人。

是的响应时间总是在计算中非常有用。 但它比RTT稍微复杂一些。 往返时间是一直在变......您的网络代码可以保持一个平均水平,但从平均方差较大。

本地客户端,远程客户机和服务器都使用预测算法的当前位置。 下面的数据是接近典型:

  • 时间:T
  • 放置:位置(X,Y,Z)和方向(X,Y,Z,W)
  • 运动:线性运动向量赋予方向长度为速度(X,Y,Z),并给予轴线与长度为转速(X,Y,Z)的旋转运动矢量

你需要的是从[T,P,M]设置为simtime推断算法。 我不会在这里提供这些。

当客户端注册在船中的[T,P,M]的驱动器的改变,这不会到达服务器,直到T + DeltaT的。 但是,如果DeltaT是典型的网络延迟的容差范围内,该服务器可以说“是的,它发生在T,我接受。” 否则,它可能要更正该客户说:“不,多数民众赞成出公差的,它发生在我的时间T””在这种情况下,客户将不得不重播所有后续驱动的[T,P,M]从服务器的纠正一个变化(这意味着你需要保持他们的队列或列表)。

接下来的客户端将在T +泵抽气+ differentdeltaT得到它。 它不可能改变什么它已经模拟,所以如果没有延迟它的模拟它会跳远程舰,你会看到一个混蛋框架。 这就是为什么远程驱动的船舶应该有自己的模拟由时间始终大于2 * typicaldeltaT延迟。 这应该是一个恒定的延迟,或者逐渐改变的延迟,严重滞后的时候,你会看到仍然挺举帧

可以流畅的额外平滑代码都抽搐但直到你的代码,否则完美无瑕,因为它只是使人们无法看到问题所在不这样做。

你必须有一个良好的同步的时间参考。 很多代码在那里做它,而草率(如RakNet没有(或没有)做得很好)。 这里有一个很好的提示:在短期内,你可以假定每个人的时钟以同样的速度运行,而你只需要搞清楚的是什么偏移,所以保持最大和最小偏移的窗口并关闭它作为你学习; 从长远来看,你需要补偿的客户时钟不运行或快或慢,所以允许在打开的窗口,如果你肯定知道它必须。 您必须使用本地时间源是单调递增的,而不是键入关闭处理器的速度(这在当今是变量)。

不,不耽误局部仿真当地的“阿凡达”移动时。 这似乎太没有反应。 你可以稍微延迟它(达50ms的可能),以帮助提高同步,而是延迟所有的出路在RTT将使你的游戏看起来令人沮丧的响应。 设置本地延迟一个选项,并用它玩,因为一个小一致的延迟是可以接受的,并同步提高。 但它不是必要的,可能会导致很多问题,所以我建议做最后的代码。 (如果你正在尝试做一个FPS游戏近战,你需要做到这一点,所有其他的帮助,你可以得到)。

至于作弊预防与模拟平滑:首先,客户端不应该仅仅从一个已知位置,官方立场发生变化时推断。 它应该注册一个调整向量,慢慢地从旧路径移动到新路径平滑(但像我上面所说的最后一个做到这一点的代码,否则会掩盖其他错误)。 其次,服务器应该容忍范围广泛的延迟......即使在同一个以太网机器的数据包延迟通常运行5毫秒为100ms左右......这是一个相当范围。 当然,你需要把它割下来,并说:“如果你说你在时间T移动,但我得到了在T + some_large_number那么我认为你正在试图调整过去,骗我的包。” some_large_number不应该比平均RTT更大,让人们诚实。

仿真将永远不会被紧密同步。 他们应该留在400ms内左右在互联网上,但肯定在滞后......到30秒以上的时间将流浪的那个之外,你需要忍受的东西,是因为他们并不少见。 鉴于互联网是由铜光的速度的限制,你总是可以期待单向潜伏期一般在至少100ms的最小的为你的客户远,经常为500ms或更长的时间范围内。

因此我强烈建议你不要试图通过互联网混战的FPS游戏(一些大公司尝试,但总是有麻烦)。 有技巧,你可以,如果你使用的是弹(由运行它们快速在一个模拟和其他慢),这样,即使时间结束了,它看起来在做。 此外,FPS游戏使用命中检测是基于模拟攻击的规则......那感觉,当攻击者知道他是在目标和遗漏死多错,那么当一名后卫知道他在外面的道路,被击中无论如何。 你必须选择一个或另一个,和心理上这就是它如何已经完成。 近战需要同步的水平,这是不可能坦言,最游戏公司不会碰MMORPG FPS混战,而是使用自动打靶(试玩真人在线,你就会明白我的意思)。

祝好运。



Answer 3:

对于Q1:看起来我的权利。

Q2:我已经在过去这样做的方式是:如果你想要的东西感到响应,启动客户端的模拟立刻执行的动作,那么服务器在游戏时候的人发起的动作模拟前进。 即客户知道在游戏simualation时间就开始什么毫秒,因此服务器可以在那个时候开始它也(注:这是永远向后,从服务器的当前时钟周期的时间,所以你必须回来节省时间状态去做这个)。

Q3:在客户端只真正需要知道,他们是在一次X模拟,服务器说,事件集{A,B,C}发生在次{X,Y,Z}。 然后,客户机和服务器可以模拟着用相同的信息,一般保持同步(除非同时发生冲突)。 在这种情况下,你让服务器重新同步的东西,所以你通常错误的很紧利润率和主要流畅的体验中结束。

如果你的目标是改善延迟的感觉你可能也只是尝试信任的客户端。



Answer 4:

有几种网络模型来解决这些问题;

在网络游戏中,你需要同步两个东西,一个是时间,另一个是空间。

  1. 一个网络游戏模式叫步调一致;

你应该看看由empire2游戏工作室,这说明步调一致模型细节的时代写的文章。

在由框架此模型,客户端和服务器运行的游戏逻辑框架,例如,RTS使用100毫秒,帧,服务器和客户端将同步帧ID,这意味着同步时间。

客户在第50帧,发送命令MoveForward,但不立即运行,客户端会告诉服务器以51帧运行移动命令; 然后,当框架51来的时候,服务器和客户端将在同一时间运行命令。 所以客户端和服务器的逻辑将是相同的。

在这样的模型中,在第50帧,客户端和服务器将运行在框架49也许发出的命令,所以有时总是在客户端输入反馈100毫秒或更多的延迟。

客户端和服务器之间的滞后不仅包含网络RTT,而且还包含逻辑帧延迟,其为100ms;

在这个模型中,同步的空间,你需要让你的客户端代码和服务器代码确定性,所以他们只能sync命令和frameId,有没有需要同步实体状态。

在这种模式下,输入反馈是大的,所以你需要播放动画或声音来帮助玩家忽略的滞后。

  1. 其他车型使用状态同步

在这个模型中,我们还需要时间同步,所以客户端将你猜怎么着当前时间服务器。

当玩家输入,客户端立即移动,然后发送移动命令或客户机目标POS服务器与当前服务器的时间戳,这是由客户端估计。

当服务器收到客户端的命令,它知道什么时候该命令在服务器时间客户端发出,它会尝试与外推运行的命令。

所有其他客户端将收到的命令,与它的服务器时,所有其他客户端将尝试推断命令。

这些技术包括客户端预测,服务器滞后补偿,服务器实体插值。

在这个模型中,客户端输入反馈是短暂的,但对于一些冲动的命令,如使用的技能,我们仍然需要使用步调一致方法,动画,声音和粒子特效化妆输入反馈时间。

在网络游戏中,有至少两种命令,第一状运动,命令将在一定时间内运行,像源源不断,其具有连续性的属性。

其他像使用技能与冷的时候,命令的效果将在冲动,我们应该区别对待。



Answer 5:

有一些很好的多人游戏使用一种机制,让玩家即使在大量的往返时间,允许客户来决定发送玩家对服务器的位置平滑地移动。 有欺诈行为的检查机制,但客户端是免费的,这一点。 因此,如果往返时间的推移疯子你看到人们从一个地方跳,而你是平滑移动的地方。 即使是一些MMO游戏把它带到下一阶段,允许用户来处理单人游戏内容,而服务器的同意。 只有统计,战斗报告和其他一些信息与少数欺诈检查数据一起发送到服务器。



文章来源: Do good multiplayer/mmo client<>server games use latency within movement calculations?