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

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

我的 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();

最佳答案

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

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

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

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

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

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

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

关于node.js - 游戏中node.js和socket.io的大滞后(实时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47659084/

相关文章:

node.js - EventEmitter 创建

android - 在 Android 上使用 QUdpSocket 发送数据

javascript - 我如何手动解析 NodeJS 并辨别所需的文件

node.js - Mongoose 嵌套数组、树和嵌入式文档

c - C 语言的服务器/客户端程序 : how to send correctly dimension of structure elements via socket?

c# - 将 C 套接字客户端连接到 C# 套接字服务器

javascript - Chrome 10.0.612 开发 Websocket 问题?

javascript - Websocket 服务器在多人游戏中存在大量延迟

java - 本地主机上的 Apache Tomcat websockets 实现

javascript - 数组过滤器更改主数组