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

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

我将其减less到最小的情况:

服务器(最小的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 (我正在使用Galaxy Nexus和Chrome)时间between 400 and 600 ms变化,无论哪种方式都会出现更多的极端峰值。

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

关于networking数据包什么时候会到达您,您没有任何承诺。 如果你没有使用像TCP这样可靠的协议,你不能确定一个数据包是否能够到达你。 有时候数据包会丢失。

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

networking消息间隔是一个可靠的时机可怕的机制。

另外一种可能的解释是,如果你怀疑数据包丢失的可能性不大,那么在这种低功耗的移动设备上,networking驱动程序根本就没有足够的时间在CPU上(或者没有CPU时间相当快),所以在处理在物理networking设备上接收到的分组队列时存在驱动程序级别的延迟。

  1. 一些代理不允许web套接字连接,所以万一它不,那么你需要切换到HTTP。
  2. 由于移动networking不可靠,有可能您的networking套接字不在线,在某个特定的时间内检查连接是否激活将会很好。 如果不是,则build立新的连接。