游戏node.js和socket.io中的大滞后(实时)

时间:2017-12-05 17:11:10

标签: node.js sockets websocket socket.io real-time

我有一个socket.io的大问题,这使我的实时游戏无法播放。

我希望我的node.js服务器每隔20ms向每个连接的客户端(每个套接字)发送数据

但是我注意到客户端没有每20毫秒收到一次,它每100到200毫秒收到几个。这使得游戏完全无法播放(非常大的滞后)

在当地它的效果非常好。

你能帮帮我吗? 这是我的函数的一段代码,它发送数据(服务器端):

function sendData()
{
  playersList.forEach( (player) =>
  {
    let data = [];
    // code which add data to "data" variable

    socketsList[player.id].emit('refreshGame', JSON.stringify(data));
  });

  setTimeout(sendData, 20);
}

sendData();

1 个答案:

答案 0 :(得分:0)

这是因为存在一些网络瓶颈。这是因为:

  1. 发送的数据包非常大。
  2. 慢速网络。
  3. 要缓解,请尝试optimize sending packets,IE仅发送所需的数据。例如,如果我有一个带有移动和非移动组件的游戏,即使您可能多次发送移动组件,也只发送一次非移动组件。

    另一种选择是诊断网络,这超出了此stackoverflow问题的范围。

    然而,虽然这些是事实"但是根据我自己的经验,有一些非传统的或小的调整似乎可以解决这个问题。

    1. 摆脱emit函数的JSON.stringify。 Socket.emit会自动为您执行此操作。
    2. 将setTimeout放在函数的开头,而不是结尾。
    3. 另外,请确保socketsList[player.id]是播放器的实际套接字。如果你在某个时候使用socketsList.splice,它会使索引陷入混乱,使得它将数据包发送给错误的客户端。