情景假设:
a 客户端发送位置移动消息(包括当前位置和当前速度),经过服务器 s ,发到客户端 b,因为网络延迟而造成客户端 b 接收到消息时,客户端又移动了一定的距离,所以此时 b 客户端从 a 发送的位置开始按照a发送的速度开始移动,这就出现了位置的不同步;
解决方法:
我们只要在发送数据时将 “发送时间” 也加到发送的消息中,接收方接收到消息时,就可以根据当前时间和发送的时间的时间差知道此发送方又移动了多少的距离,所以直接将位置移动到新的位置,在新的位置开始移动按照原先的速度开始移动,这样就可以解决延时的问题。
新问题:此时会出现新的问题,就是客户端 a 和客户端 b 的时间是不同步的,所以我们不能知道两者的时间差是多少?
方法一:根据时间差进行位置的预测拉扯(如果发送的延时和接收的延时不相同)
因为服务器的时间是统一的,所以我们可以按照服务器的时间来统一时间,具体方法如下:
-
获得时间差:客户端发送当前时间 tc1 到 服务器,服务器当前的时间是ts,再将 ts 时间发送到客户端,此时客户端的时间是tc2,所以得到客户端的
发送时间差 dt1 = ts - tc1
接收时间差 dt2 = ts - tc2
将这两个数据保存(必须隔一段时间更新一次,当然每次发送位置信息更新一次也是可以的,这个可以根据情况自己决定)
-
开始计算:设 a 客户端的两个时间差是 dta1 和 dta2 ,客户端 b 的两个时间差分别是 dtb1 和 dtb2,a 在 t1 发送消息到服务器 s ,此时服务器时间是 t2,服务器将消息发送到客户端 b,理论上客户端b的时间是 t3,满足如下:
t2 - t1 = dta1
t2 - t3 = dtb2
==》t3 = dta1 - dtb2 + t1但是 b 接收到消息时,实际上 b 的时间是t4 ,即此时从 a 发送数据到现在已经经过的时间dt是
dt = t4 - t3
此时 a 又移动的距离是dx = dt * v(发送的速度),所以将b的位置按照a位置拉扯多dx,再在新的位置按照接收的速度开始移动。
综上所述:最终发送的消息包含的数据有 当前位置,速度,发送时间差
方法二:根据时间差进行位置的预测拉扯(假设发送的时延和接收的时延是相同)
- 这种条件下的判断更加简单,但是存在不合理的地方
- 客户端在 t1 时刻发送消息到服务端,服务端将数据返回客户端,客户端接收到数据的时间是 t2,此时可以得到网络的时延是
t2 - t1
,因为假设发送的时延和接收的时延是相同的,所以可以知道发送的时延是dt = (t2 - t1)/ 2
- 开始计算:设客户端 a 的网络时延是dta , 客户端 b 的网络时延是dtb , a 在 t1 发送消息,最终到达 b, b的时间是t3,可以知道这段时间经过网络延时造成的时间误差是:
dt = t3 - (dta + dtb)
,此时 a 又移动的距离是dx = dt * v(发送的速度)
,所以将b的位置按照a位置拉扯多dx,再在新的位置按照接收的速度开始移动。
综上所述:最终发送的消息包含的数据有 当前位置,速度,延迟时间
网友评论