V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imherer
V2EX  ›  程序员

长连接手游 ping 值是怎么实现的?

  •  
  •   imherer · 2017-08-08 15:46:35 +08:00 · 4807 次点击
    这是一个创建于 2455 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如王者荣耀右上角有一个实时显示当前延迟的数字,这个是怎么实现的? 客户端不停的像服务器发送请求,服务器收到后返回给客户端,然后客户端拿到服务器的返回后,计算这个时间差吗?

    socket.io 有封装好的 api 吗?

    27 条回复    2017-08-12 15:33:50 +08:00
    Famio
        1
    Famio  
       2017-08-08 15:52:14 +08:00   ❤️ 1
    从“欢迎来到王者荣耀”开始,计时器就开始计时了,而后周期性的计算封包来往时间做计算。
    zjsxwc
        2
    zjsxwc  
       2017-08-08 16:00:16 +08:00   ❤️ 1
    应该可以通过计算心跳包间隔时间,得出 ping 值,不用刻意再搞个 ping 计算接口吧。
    8355
        3
    8355  
       2017-08-08 17:30:16 +08:00   ❤️ 1
    数据包一直在传递啊 持续计算就行了啊.
    41547Caesar
        4
    41547Caesar  
       2017-08-08 17:36:27 +08:00   ❤️ 1
    @Famio 打开游戏就开始了吧,登录以后右上角就有一个延迟的展示。
    flynaj
        5
    flynaj  
       2017-08-08 21:27:09 +08:00 via Android   ❤️ 1
    win10 任务管理器里面也有
    akira
        6
    akira  
       2017-08-08 22:50:12 +08:00   ❤️ 2
    服务器返回的 封包里面 带上发送时候的时间,本地收到以后,获取本地时间和他做下计算,就可以了啊
    realpg
        7
    realpg  
       2017-08-09 01:21:11 +08:00   ❤️ 1
    @akira #6
    结果由于服务器跟本地时钟不一致,每个包延迟 2 分钟
    liuminghao233
        8
    liuminghao233  
       2017-08-09 01:46:21 +08:00 via iPhone   ❤️ 1
    @akira
    要是服务器在美国 客户在中国
    那延时岂不是四万多秒?
    这个游戏节奏有点慢啊
    lslqtz
        9
    lslqtz  
       2017-08-09 01:58:43 +08:00   ❤️ 1
    @liuminghao233 统一 UTC 或 UNIX 时间戳不行?
    raysonx
        10
    raysonx  
       2017-08-09 02:09:23 +08:00 via iPad   ❤️ 1
    客户端发送本地时间到远程服务器,远程服务器反射时间,客户端收到后拿收到时间做减法
    msg7086
        11
    msg7086  
       2017-08-09 04:45:14 +08:00   ❤️ 1
    @liuminghao233 时间包括时区啊。
    xenme
        12
    xenme  
       2017-08-09 06:33:04 +08:00 via iPhone   ❤️ 1
    @liuminghao233 这么复杂?记录发出去的时间,然后看回包啥时候到的,计算下时间差就好了么,哪里还要时区
    acros
        13
    acros  
       2017-08-09 06:40:03 +08:00 via iPhone   ❤️ 1
    这个游戏是帧同步的,每帧打包信息带时间戳....
    ytmsdy
        14
    ytmsdy  
       2017-08-09 08:57:28 +08:00   ❤️ 1
    游戏都有心跳包的,根据心跳包的返回的时间就能计算出延时时间。
    ytmsdy
        15
    ytmsdy  
       2017-08-09 08:58:06 +08:00   ❤️ 1
    @realpg 一般上都是时间戳的。不会存在时差的问题
    enenaaa
        16
    enenaaa  
       2017-08-09 09:19:29 +08:00   ❤️ 1
    @realpg 一般开始游戏时会对时。 另外心跳计算延迟跟两边时钟差距没关系啊,本地计算发送时间、接受时间即可。
    jhaohai
        17
    jhaohai  
       2017-08-09 09:23:15 +08:00 via iPhone   ❤️ 1
    通信数据都带时间戳的吧
    sujin190
        18
    sujin190  
       2017-08-09 09:44:22 +08:00   ❤️ 1
    @realpg #7
    @liuminghao233 #8 先肯定是要校时的啊,还用说,否则多人怎么确认都是在同一个画面上啊
    zpf124
        19
    zpf124  
       2017-08-09 10:22:19 +08:00
    恕我愚钝, 游戏不都是 udp 么...
    用 tcp 长连接的,应该早就顺序发送,数据校验以及丢包重传 延迟超过 3s 了。
    zpf124
        20
    zpf124  
       2017-08-09 10:23:23 +08:00
    @zpf124 漏了几个字, “应该早就(因为)”
    zpf124
        21
    zpf124  
       2017-08-09 10:26:58 +08:00
    socket.io 应该可以尝试去做 一个 类似 大话 梦幻之类的对实时要求不高的游戏。
    zpf124
        22
    zpf124  
       2017-08-09 10:43:18 +08:00   ❤️ 1
    不过我说的好像也不一定对,现在网络基础设施都好不少了, 像 下面这种 的 io 游戏 都是基于 websocket 的。
    http://agar.io/
    http://slither.io/


    而且在国内有服务器的话,应该不会太卡 ,见过人用流量玩贪吃蛇那个,延迟 150ms-200ms 左右。
    liuminghao233
        23
    liuminghao233  
       2017-08-09 13:00:29 +08:00 via iPhone   ❤️ 1
    @sujin190
    参考 12 楼的做法,
    测个延迟并不需要两端统一时间
    Keyes
        24
    Keyes  
       2017-08-09 17:41:30 +08:00 via iPhone
    Ping/pong 绝对是不二之选
    imherer
        25
    imherer  
    OP
       2017-08-09 17:43:18 +08:00
    @Keyes 具体怎么做呢?
    tvallday
        26
    tvallday  
       2017-08-10 01:18:32 +08:00 via iPhone   ❤️ 1
    楼上有些人说的是 NTP,实现的算法看起来很简单,但是由于步骤繁多很容易出错。楼主问的问题其实只涉及到 heartbeat,服务器发送 ping 请求是自动收到 pong 回复的,至少 websocket 是这样。这样的算法就简单很多。在 socket.io 上就更简单了,因为 ping/pong 是自带的。。
    wanghe826
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3152 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 13:20 · PVG 21:20 · LAX 06:20 · JFK 09:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.