Javascript Websocket间隔:移动设备上的性能问题?

Javascript Websocket间隔:移动设备上的性能问题?,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,在我当前的项目中,我发现在移动设备上使用带有socket.io和node.js的websockets存在问题。移动设备在一段时间内处理套接字消息似乎存在问题 我将其简化为一个最小的场景: 服务器(minimal express.js server)以特定的间隔向客户端发送消息: setInterval(function(){ socket.emit('interval'); }, 500); 客户端只是测量收到消息之间的时间间隔并显示它们: socket.on('interval', fu

在我当前的项目中,我发现在移动设备上使用带有socket.io和node.js的websockets存在问题。移动设备在一段时间内处理套接字消息似乎存在问题

我将其简化为一个最小的场景:

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

setInterval(function(){
  socket.emit('interval');
}, 500);
客户端只是测量收到消息之间的时间间隔并显示它们:

socket.on('interval', function (data) {
  timeElement.html(new Date() - startTime);
  startTime = new Date();
});
桌面上
(使用Chrome),消息之间的时间间隔非常稳定,为
515毫秒
。所以它就像15毫秒的延迟,但消息间隔是一致的

移动设备上
(我使用的是Galaxy Nexus和Chrome),时间在400到600毫秒之间变化
,在这两种方式中都有一些极端峰值


我想使用这样的间隔作为游戏转向指示器,而这个问题会导致移动设备上的许多玩家移动滞后且不均匀。

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

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

网络消息间隔是可靠定时的一种糟糕机制

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

  • 有些代理不允许web套接字连接,所以如果不允许,则需要切换到HTTP
  • 由于移动网络不可靠,您的web套接字可能不活动,因此最好在某个特定时间段内不断检查连接是否处于活动状态。如果不是,则建立新连接

  • 谢谢移动设备似乎能够接收更多的信息。将间隔设置为50时,时间也会有所不同,但会处理所有消息。对于大约每50毫秒更新一次客户端的替代解决方案,是否有良好的读数?