【问题标题】:Websocket interval: performance problems on mobile devices?Websocket 间隔:移动设备上的性能问题?
【发布时间】:2014-08-30 05:58:32
【问题描述】:

在我当前的项目中,我发现在移动设备上使用带有 socket.io 和 node.js 的 websockets 存在问题。移动设备处理socket消息的间隔好像有问题。

我把它简化为一个最小的场景:

服务器(最小的 express.js 服务器)以特定的时间间隔向客户端发送消息:

setInterval(function(){
  socket.emit('interval');
}, 500);

客户端只是弄乱接收消息之间的时间并显示它们:

socket.on('interval', function (data) {
  timeElement.html(new Date() - startTime);
  startTime = new Date();
});

在desktop(使用 Chrome)上,消息之间产生的时间在515 ms 相当稳定。所以它就像一个 15 毫秒的延迟,但消息间隔是一致的。

在mobile device(我使用的是带有 Chrome 的 Galaxy Nexus)上,时间会有所不同between 400 and 600 ms,无论哪种方式都有更多的极端峰值。

我想使用这样的间隔作为游戏回合指示器,这个问题导致移动设备上的玩家移动很多滞后和不均匀。

【问题讨论】:

    标签: javascript node.js websocket socket.io


    【解决方案1】:

    您无法保证网络数据包何时会到达您手中。如果您没有使用像 TCP 这样的可靠协议,则无法确定 if 数据包会到达您的手中。有时数据包会被丢弃。

    碰巧的是,您正在使用 TCP(它是 WebSockets 的底层网络级协议)。当 TCP 数据包丢失时,网络必须识别丢失,然后重新发送数据包,从而造成延迟。移动设备的物理网卡可能比桌面上的物理网卡更容易丢包。

    网络消息间隔对于可靠定时来说是一种糟糕的机制。

    另一个 - 或附加 - 可能的解释(如果您怀疑不太可能丢包)是在这样一个低功耗的移动设备上,网络驱动程序根本没有在 CPU 上获得足够的时间(或者没有很快得到它的 CPU 时间),因此在处理物理网络设备上接收的数据包队列时存在驱动程序级别的延迟。

    【讨论】:

    • 谢谢。移动设备似乎能够接收更多消息。将时间间隔设置为 50 时间也会有所不同,但所有消息都会被处理。对于能够更新客户端的替代解决方案的任何良好读数。每 50 毫秒?
    【解决方案2】:
    1. 某些代理不允许 Web 套接字连接,因此如果不允许,则需要切换到 HTTP。
    2. 由于移动网络不可靠,可能是您的 web 套接字未激活,最好在特定时间段内继续检查连接是否处于活动状态。如果不是,则建立新的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-04
      • 2012-12-27
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      相关资源
      最近更新 更多