我的 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();
最佳答案
出现这种情况是因为存在一些网络瓶颈。发生这种情况的原因是:
- 发送的数据包非常大。
- 网络速度慢。
要缓解这种情况,请尝试 optimize sending packets ,IE只发送需要的数据。例如,如果我有一个包含移动和非移动组件的游戏,则仅发送非移动组件一次,即使您可能多次发送移动组件。
另一个选择是诊断网络,这超出了此 stackoverflow 问题的范围。
然而,尽管这些都是“事实”,但根据我自己的经验,有一些非常规或小的调整似乎可以解决这个问题。
- 去掉emit函数中的JSON.stringify。 Socket.emit自动为您执行此操作。
- 将 setTimeout 放在函数的开头,而不是末尾。
此外,请确保 socketsList[player.id]
是玩家的实际套接字。如果您使用socketsList.splice在某些时候,它会完全搞乱索引,使其将数据包发送到错误的客户端。
关于node.js - 游戏中node.js和socket.io的大滞后(实时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47659084/