2017-08-01 82 views
2

我正在制作一个基于磁贴的2D RPG(自上而下,32x32像素)。玩家可以使用箭头键移动到任何相邻的图块。我发现它有点难于理解插值。客户端/服务器插值

我明白游戏中的方向可以突然改变,像航位推算这样的概念将毫无用处。

客户端预测正常工作,但是,当我从服务器收到有关其他客户端位置的不同语言的更新时,我很难理解这个概念。

例如,我的球员A.

目前,当玩家B移动,我收到他们的新位置,并从服务器的时间戳。在局域网连接上,这似乎按预期工作,并且玩家B立即在屏幕上移动,并进行正确的插值。我计算从服务器发送数据到接收数据的时间,并且每帧插入差值(16ms,60fps)。如果我有200ms的RTT,而玩家B有400ms的RTT,并且他们每250ms移动1个瓦片,我会在300ms后收到数据,所以我只能看到玩家B传送到新的瓦片。

我是否必须将其延迟时间添加到时间戳中,因此当我收到它时,时间戳匹配和动画顺利启动?

我在想这个吗?

谢谢。

编辑:我忘了提及服务器每隔50ms发送一次更新。

回答

0

如果你正在编写的模拟,其中航位推算没有价值,它会是最好有服务器捆绑的游戏状态,或者更好的比赛状态增量,作为一个单位(虽然不一定是单个数据包,如果你的状态很大)。

从你的游戏描述来看,我认为你不会允许客户独立于服务器授权游戏状态更新 - 因此客户往返时间并不重要。即使您自己的客户端的延迟和滞后也是无关紧要的 - 服务器更新率是您想要插入的值。

在某些客户端具有广泛变化的延迟或重大丢失以及许多数据包比预期晚到达的情况下,您可以在该客户端上本地加速服务器状态重播,以“赶上”,但客户端的输入将会仍然必须应用于服务器上的当前游戏状态(客户端看到延迟 - 在某些情况下会出现严重错误)。

你真的无法隐藏在像您所描述的一个,其中所呈现的游戏状态没有错误是允许游戏的等待时间 - 你只能“伪装”服务器游戏状态是在更多的模拟改变通过在两个后续数据点之间插入服务器游戏状态来实现。其他客户端的延迟总是隐藏给每个人,但客户端本身 - 即使服务器也不应该在意。

+0

谢谢MMc,我想我现在对此了解得更清楚了。该服务器具有发送玩家的位置在每个服务器更新,即使一直没有其他输入,所以我会永远在客户端的每个时步过去和当前位置?如果一个客户端只在输入处理完毕时才发送数据,那么客户端可能会在几秒钟内收不到任何服务器更新,无论如何,我可以适当插入吗? – Max6701

+0

如果你想推断,你可以使用你从前一对数据点计算出的增量,但是你需要使用外推位置作为当前数据,当你的服务器最终发送一个新的数据点时再次开始插值。如果使用来自服务器的前一位数据,那么显示的数据将是不连续的,因此使用外推法并减少随时间推移引发的任何错误通常是更好的解决方案。 – MMc