【问题标题】:Measuring latency测量延迟
【发布时间】:2015-11-05 12:07:46
【问题描述】:

我正在使用 Java 开发一个多人游戏项目,并且正在尝试改进我收集延迟测量结果的方式。

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

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

【问题讨论】:

  • 我假设您的所有通信都是使用 UDP 完成的。

标签: java networking


【解决方案1】:

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

【讨论】:

  • 谢谢。时间同步正是我的问题。我的两个 Windows 操作系统时钟与互联网时钟同步,但由于某种原因,它们仍然关闭了大约 3 秒,所以我真的找不到一种延迟方式。你的方式就像魅力一样。
【解决方案2】:

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

您还可以开始使用其他指标(例如方差),以便更准确地估计您的连接质量。

【讨论】:

  • 嗨,0verbose,我喜欢这个想法,但我想问题是每个数据包都需要一个响应,我猜的流量会加倍?
  • @TechyAdam:您收集的“时间戳”越多,您的统计数据就越准确。当然,仅仅为了收集统计数据而发送大量未使用的数据包并不是一个好主意。是的,当然,数据包需要立即响应才能有用。无论如何,它可能只是一个发送回客户端的 ack 数据包,尺寸很小,仅包含时间戳、数据包序列号和类似的数据。
  • @TechyAdam:但在回答你时,我认为你已经向客户端发送了某种 UDP ack 数据报,因为 UDP 不可靠,所以你至少需要一些 ack 来确定之前发送的数据包到达目的地。
  • @ 0verbose 我确实是,但一般间隔。我喜欢这个想法,就像你说的那样,我将有更多信息来作为我的结果的基础。谢谢。
  • 从一方获取时间戳并检查其时间戳与另一方的时间戳对我来说效果不佳,因为很难同步双方的时钟。使用下面 NPE 的答案对我来说效果更好。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如果您测量往返延迟,时钟漂移、硬件时钟精度和操作系统 api 等因素会影响您的测量。无需在硬件上花钱,最接近的方法就是使用 RDTSC 指令。但是 RDTSC 并不是没有自己的问题,你必须小心你如何称呼它。

    【讨论】:

      猜你喜欢
      • 2021-01-02
      • 1970-01-01
      • 2017-10-03
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2010-11-17
      相关资源
      最近更新 更多