在我目前的项目中,我发现在移动设备上使用带有socket.io和node.js的websockets存在问题。似乎在一个时间间隔内移动设备处理套接字消息存在问题。
我将它减少到最小的情况:
服务器(minimal 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
非常稳定。所以它像15ms的延迟,但消息间隔是一致的。
在mobile device
(我正在使用带有Chrome的Galaxy Nexus)时,时间变化between 400 and 600 ms
,两种方式都会出现更多极端峰值。
我想使用这样的间隔作为游戏转向指示器,这个问题导致移动设备上很多滞后和不均匀的玩家移动。
答案 0 :(得分:0)
您无法确定何时会收到网络数据包。如果您没有使用像TCP那样的可靠协议,那么无法确定 是否会收到数据包。有时数据包会被丢弃。
碰巧,您正在使用TCP(这是WebSockets的底层网络级协议)。当TCP数据包丢失时,网络必须识别丢失,然后重新发送数据包,从而导致延迟。移动设备的物理网卡可能比桌面上的物理卡更容易丢弃数据包。
网络消息间隔是可靠计时的可靠机制。
另一个 - 或者另外一个 - 可能的解释(如果你怀疑丢包的可能性不大)就是在这种低功耗的移动设备上,网络驱动程序根本没有足够的时间在CPU上(或者不是很快就得到了CPU时间),因此处理物理网络设备上收到的数据包队列时会出现驱动程序级延迟。
答案 1 :(得分:0)