【问题标题】:Big lag in a game node.js and socket.io (real time)游戏 node.js 和 socket.io 中的大滞后(实时)
【发布时间】:2018-05-19 10:28:56
【问题描述】:

我的 socket.io 有一个大问题,导致我的实时游戏无法玩。

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

但我注意到客户端不是每 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();

【问题讨论】:

  • 我的经验更依赖于代码复杂性和优化、noOfPlayers 和服务器规范。所以首先要尝试让你的代码轻量,比如删除冗余、刷新内存等。
  • 如果删除在我的函数sendData()emit('refreshGame', ''); 中生成数据的所有代码,并且如果我删除在客户端重新加载画布的代码(只是socket.on('refreshGame', console.log('new Date().getTime());

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


【解决方案1】:

发生这种情况是因为存在一些网络瓶颈。发生这种情况是因为:

  1. 发送的数据包非常大。
  2. 网速慢。

为了缓解,尝试optimize sending packets,IE 只发送需要的数据。例如,如果我有一个包含移动和非移动组件的游戏,即使您可能多次发送移动组件,也只发送一次非移动组件。

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

然而,尽管这些都是“事实”,但根据我自己的经验,有一些非常规或小的调整似乎可以解决这个问题。

  1. 在 emit 函数上去掉 JSON.stringify。 Socket.emit 会自动为您执行此操作。
  2. 将 setTimeout 放在函数的开头,而不是结尾。

另外,确保socketsList[player.id] 是播放器的实际套接字。如果您在某些时候使用socketsList.splice,它会完全弄乱索引,使其将数据包发送到错误的客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多