比如王者荣耀右上角有一个实时显示当前延迟的数字,这个是怎么实现的? 客户端不停的像服务器发送请求,服务器收到后返回给客户端,然后客户端拿到服务器的返回后,计算这个时间差吗?
socket.io 有封装好的 api 吗?
1
Famio 2017-08-08 15:52:14 +08:00 1
从“欢迎来到王者荣耀”开始,计时器就开始计时了,而后周期性的计算封包来往时间做计算。
|
2
zjsxwc 2017-08-08 16:00:16 +08:00 1
应该可以通过计算心跳包间隔时间,得出 ping 值,不用刻意再搞个 ping 计算接口吧。
|
3
8355 2017-08-08 17:30:16 +08:00 1
数据包一直在传递啊 持续计算就行了啊.
|
4
41547Caesar 2017-08-08 17:36:27 +08:00 1
@Famio 打开游戏就开始了吧,登录以后右上角就有一个延迟的展示。
|
5
flynaj 2017-08-08 21:27:09 +08:00 via Android 1
win10 任务管理器里面也有
|
6
akira 2017-08-08 22:50:12 +08:00 2
服务器返回的 封包里面 带上发送时候的时间,本地收到以后,获取本地时间和他做下计算,就可以了啊
|
8
liuminghao233 2017-08-09 01:46:21 +08:00 via iPhone 1
|
9
lslqtz 2017-08-09 01:58:43 +08:00 1
@liuminghao233 统一 UTC 或 UNIX 时间戳不行?
|
10
raysonx 2017-08-09 02:09:23 +08:00 via iPad 1
客户端发送本地时间到远程服务器,远程服务器反射时间,客户端收到后拿收到时间做减法
|
11
msg7086 2017-08-09 04:45:14 +08:00 1
@liuminghao233 时间包括时区啊。
|
12
xenme 2017-08-09 06:33:04 +08:00 via iPhone 1
@liuminghao233 这么复杂?记录发出去的时间,然后看回包啥时候到的,计算下时间差就好了么,哪里还要时区
|
13
acros 2017-08-09 06:40:03 +08:00 via iPhone 1
这个游戏是帧同步的,每帧打包信息带时间戳....
|
14
ytmsdy 2017-08-09 08:57:28 +08:00 1
游戏都有心跳包的,根据心跳包的返回的时间就能计算出延时时间。
|
17
jhaohai 2017-08-09 09:23:15 +08:00 via iPhone 1
通信数据都带时间戳的吧
|
18
sujin190 2017-08-09 09:44:22 +08:00 1
|
19
zpf124 2017-08-09 10:22:19 +08:00
恕我愚钝, 游戏不都是 udp 么...
用 tcp 长连接的,应该早就顺序发送,数据校验以及丢包重传 延迟超过 3s 了。 |
22
zpf124 2017-08-09 10:43:18 +08:00 1
不过我说的好像也不一定对,现在网络基础设施都好不少了, 像 下面这种 的 io 游戏 都是基于 websocket 的。
http://agar.io/ http://slither.io/ 而且在国内有服务器的话,应该不会太卡 ,见过人用流量玩贪吃蛇那个,延迟 150ms-200ms 左右。 |
23
liuminghao233 2017-08-09 13:00:29 +08:00 via iPhone 1
|
24
Keyes 2017-08-09 17:41:30 +08:00 via iPhone
Ping/pong 绝对是不二之选
|
26
tvallday 2017-08-10 01:18:32 +08:00 via iPhone 1
楼上有些人说的是 NTP,实现的算法看起来很简单,但是由于步骤繁多很容易出错。楼主问的问题其实只涉及到 heartbeat,服务器发送 ping 请求是自动收到 pong 回复的,至少 websocket 是这样。这样的算法就简单很多。在 socket.io 上就更简单了,因为 ping/pong 是自带的。。
|
27
wanghe826 2017-08-12 15:33:50 +08:00 1
ping 使用的是 ICMP 协议, 我这个应用就是基于苹果提供的 API 根据平均时间差来计算 ping 值,楼主可以看看是不是这个样子的? https://itunes.apple.com/us/app/bigvpn/id1225850922?mt=8
|