如何在C#中获取服务器和客户端之间的延迟?

DfK*_*era 7 .net c# sockets latency client-server

我正在为一个游戏引擎开发一个C#Server应用程序,我正在用ActionScript 3编写.我正在使用权威服务器模型来防止作弊并确保公平游戏.到目前为止,一切运作良好:

当客户端开始移动时,它会告诉服务器并在本地开始渲染; 然后,服务器告诉其他人客户端X已经开始移动,其中包含详细信息,以便他们也可以开始渲染.当客户端停止移动时,它会告诉服务器,该服务器根据客户端开始移动的时间执行计算,并且客户端呈现滴答延迟并回复所有人,因此他们可以使用正确的值进行更新.

问题是,当我在服务器计算中使用默认的20ms滴答延迟时,当客户端移动相当长的距离时,当它停止时会有明显的向前倾斜.如果我将延迟略微增加到22ms,在我的本地网络上一切都运行得非常顺利,但在其他地方,倾斜仍然存在.经过一番实验后,我注意到所需的额外延迟几乎与客户端和服务器之间的延迟有关.我甚至把它煮成了一个非常好的公式:延迟= 20 +(延迟/ 10).

那么,我将如何继续获取某个客户端和服务器之间的延迟(我正在使用异步套接字).CPU的工作量不能太大,因为没有服务器运行缓慢.此外,这真的是最好的方式,还是有更有效/更简单的方法来做到这一点?

Kyl*_*tan 11

很抱歉,这不是直接回答你的问题,但一般来说你不应过分依赖测量延迟,因为它可能变化很大.不仅如此,你不知道你测量的ping时间是否是对称的,这很重要.如果事实证明,20ms的ping时间实际上是从服务器到客户端的19ms,从客户端到服务器的1ms,则没有必要应用10ms的延迟校正.而在应用方面的等待时间是不一样的,因为在网络术语 - 你可能能够ping某台机器在20毫秒得到响应,但如果你接触的是机器,只处理网络输入上的服务器50次,然后第二你的回复将被延迟0到20毫秒,这将变化相当不可预测.

这并不是说延迟测量它没有平滑预测的地方,但它不会解决你的问题,只是清理一下.

在它面前,这里的问题似乎是,你您可以使用它直到接收的​​最后一条消息推断数据的第一个消息中发送的信息.如果一切都保持不变,则第一消息乘以该消息之间的时间中给定的移动矢量将给出服务器的正确结束位置,客户端是在大致NOW-(等待时间/ 2).但是如果延迟发生变化,则消息之间的时间会增加或缩小.客户可能知道他移动了10个单位,但是服务器模拟他移动了9或11个单位,然后被告知要将他复活到10个单位.

对此的一般解决方案是不假设延迟将保持不变,而是发送定期位置更新,这允许服务器验证并纠正客户端的位置.现在只有2条消息,在第二条消息之后找到并纠正了所有错误.随着更多消息的出现,错误会分布在更多的采样点上,从而实现更平滑,更不可见的校正.

它永远不会是完美的:它只需要在最后一毫秒的运动中出现滞后峰值,服务器的表示就会超调.你不能得到解决,如果你预测未来基于移动的往事,因为有对选择没有真正的替代品无论是正确的,但后期或不正确的,但是,由于及时的信息需要时间去旅行.(责备爱因斯坦.)


Sim*_*Sim 5

使用ICMP时要记住的一件事基于的ping是,网络设备通常会给 ICMP 流量比普通数据包更低的优先级,尤其是当数据包跨越网络边界(如 WAN 链接)时。这可能导致 ping 被丢弃或显示比流量实际经历更高的延迟,并有助于成为问题的指示器而不是测量工具。

越来越多的使用 在网络中服务质量(QoS) 只会加剧这种情况,因此尽管 ping 仍然是一个有用的工具,但需要理解的是,对于非基于 ICMP 的真实网络,它可能不是网络延迟的真实反映。交通。

Itrinegy 博客上有一篇很好的帖子,这些天你如何测量网络中的延迟 (RTT)?对这个。