【发布时间】:2015-11-05 12:07:46
【问题描述】:
我正在使用 Java 开发一个多人游戏项目,并且正在尝试改进我收集延迟测量结果的方式。
我当前的设置是定期发送一批 UDP 数据包,这些数据包由服务器加盖时间戳并返回,然后计算并记录延迟。我取了一些样本,然后计算出平均值以获得延迟。
这似乎是解决客户端延迟的合理解决方案吗?
【问题讨论】:
-
我假设您的所有通信都是使用 UDP 完成的。
标签: java networking
我正在使用 Java 开发一个多人游戏项目,并且正在尝试改进我收集延迟测量结果的方式。
我当前的设置是定期发送一批 UDP 数据包,这些数据包由服务器加盖时间戳并返回,然后计算并记录延迟。我取了一些样本,然后计算出平均值以获得延迟。
这似乎是解决客户端延迟的合理解决方案吗?
【问题讨论】:
标签: java networking
我会让客户端为传出的数据包添加时间戳,并让响应保留原始时间戳。通过这种方式,您可以计算往返延迟,同时避免因服务器和客户端时钟不完全同步而导致的任何问题。
【讨论】:
您还可以为游戏协议中使用的数据包添加时间戳。因此,您将有更多数据来整合您的统计数据。 (这种方法对于避免额外的数据突发造成的开销也很有用。您只需使用已经交换的数据来进行统计)
您还可以开始使用其他指标(例如方差),以便更准确地估计您的连接质量。
【讨论】:
如果您还没有真正开始您的项目,请考虑使用像 KryoNet 这样的网络框架,它具有 RMI 和高效的序列化,并且会使用 UDP 自动发送 ping 请求。您可以轻松获取 ping 时间值。
【讨论】:
如果您测量往返延迟,时钟漂移、硬件时钟精度和操作系统 api 等因素会影响您的测量。无需在硬件上花钱,最接近的方法就是使用 RDTSC 指令。但是 RDTSC 并不是没有自己的问题,你必须小心你如何称呼它。
【讨论】: