Corona SDK位置预测

时间:2014-06-26 21:03:19

标签: lua corona multiplayer

我正在使用Corona sdk创建一个多人游戏。每个设备每秒发送15条消息,包含其角色的位置。这会导致一个不稳定的移动,因为有些消息需要稍微不同的时间才能被接收,并且它在30 fps游戏中每秒仅发送15次。如果在下一帧中没有接收到数据,我如何区分从前一帧到当前帧的字符位置或旋转以预测位置。我对其他解决方案也完全开放!谢谢!

1 个答案:

答案 0 :(得分:1)

如果发送速率是固定的并且双方都知道(发送方和接收方),则接收方可以认为它。在这种情况下,航位推算是一种易于应用的成熟技术。例如,如果发送方每1/15秒发送一次数据,则接收方可以假设,在收到第一个数据包之后,任何其他数据包将相隔1/15秒。如果在1/15秒之后没有收到某些东西,那么接收器会猜测如果已经收到数据,那么数据将在1/15秒。然后当数据包实际到来时,它会纠正猜测。

唯一要保证的是数据包的顺序和交付。如果数据包永远不会丢失,并且总是按顺序到达(即TCP),那么你就会笑。

如果订单得到保证但有些订单被丢弃,那么接收方需要知道何时发生丢弃。我认为这可以通过作为数据包一部分的计数器来纠正。因此,如果接收器获得具有counter = X的数据包,并且下一个数据包具有packet = X + 2,则接收器知道数据包因为顺序被保证而被丢弃,因此两者之间的时间差是2/15秒。

如果没有下降但订单无法保证,计数器也会有帮助:你的接收器保证如果X到达,X + 1最终会到达,所以即使它得到X + 2,也应该保存X + 2并等到X + 1到来。

最后,如果既不保证交付也不保证订单(WAN上的UDP数据包的情况),那么再一次计数器就足够了,但算法会改变:如果它得到一个带有counter = X的数据包,它就会得到X + 2 ,这可能意味着X + 1已经被删除,或者很快就会到达,但是没有办法知道。因此接收器可以等待少量(可能是另外的1/15秒)如果X + 1到达时没有到达,则将其声明为丢弃(因此如果最终到达则将被忽略)。

近乎恒定的发送频率在上述情况下至关重要。