2011-03-25 76 views
5

我正在研究Java中的多人游戏项目,我正在尝试优化如何收集我的等待时间测量结果。测量等待时间

我目前的设置是定期发送一批UDP数据包,获得服务器的时间戳并返回,然后计算并记录延迟。我拿了一些样本,然后计算出平均值以得到延迟。

这似乎是一个合理的解决方案来解决客户端的延迟?

+0

我假设你所有的沟通都是使用UDP完成的。 – biziclop 2011-03-25 16:40:11

+0

的确,这是正确的。 – TechyAdam 2011-03-25 17:04:14

回答

3

您还可以对游戏协议中使用的数据包进行时间戳记。所以你将有更多的数据来整合你的统计数据。 (这种方法对于避免额外突发数据造成的开销也很有用,您只需使用已经交换的数据来完成统计)

您也可以开始使用其他度量(例如方差)为了更准确地估计您的连接质量。

+0

嗨0verbose,我喜欢这个想法,但我想问题是每个数据包都需要响应类型,我猜想的流量翻倍? – TechyAdam 2011-03-25 17:08:34

+0

@TechyAdam:你收集的“时间戳”越多,你的数据就越准确。当然,为了收集统计数据而发送大量未使用的数据包并不是一个好主意。是的,当然一个数据包需要立即回应才有用。无论如何,它可能只是一个发送回客户端的ack数据包,它只有一个小小的维度,只包含时间戳,数据包序列号和很少的数据。 – Heisenbug 2011-03-25 17:33:33

+0

@TechyAdam:但在回答你的问题时,我认为你已经发送回客户端某种UDP数据报,因为UDP不可靠,所以你至少需要一些确认,以确保发送之前的数据包到达目的地。 – Heisenbug 2011-03-25 17:35:19

15

我会有客户端时间戳输出数据包,并有响应保留原始时间戳。通过这种方式,您可以计算往返延迟,同时避免因服务器和客户端时钟未完全同步而导致的任何问题。

+1

谢谢。时间同步正是我的问题。我的两个Windows操作系统时钟与互联网时钟同步,但由于某些原因,他们仍然关闭了大约3秒,所以我无法真正找到单向延迟。你的方式就像魅力一样。 – 2014-07-05 23:09:18

0

如果您还没有真正开始您的项目,请考虑使用像KryoNet这样的网络框架,该网络框架具有RMI和高效的序列化,并且会使用UDP自动发送ping请求。您可以轻松获得ping时间值。

0

如果您正在测量往返延迟,则时钟漂移,HW时钟精度和OS api等因素会影响您的测量。不用在硬件上花费金钱,您可以使用RDTSC指令获得最接近的硬件。但RDTSC不会没有它自己的问题,你必须小心你怎么称呼它。