最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 8浏览 0评论

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

我有一个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. 发送的数据包非常大。
  2. 网速慢。

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

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

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

  1. 摆脱emit函数的JSON.stringify。 Socket.emit会自动为您完成此操作。
  2. 将setTimeout放在函数的开头,而不是结尾。

另外,确保socketsList[player.id]是玩家的实际套接字。如果你在某些时候使用socketsList.splice,它会使索引陷入困境,使它将数据包发送到错误的客户端。

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

我有一个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. 发送的数据包非常大。
  2. 网速慢。

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

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

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

  1. 摆脱emit函数的JSON.stringify。 Socket.emit会自动为您完成此操作。
  2. 将setTimeout放在函数的开头,而不是结尾。

另外,确保socketsList[player.id]是玩家的实际套接字。如果你在某些时候使用socketsList.splice,它会使索引陷入困境,使它将数据包发送到错误的客户端。

发布评论

评论列表 (0)

  1. 暂无评论