游戏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();
回答如下:
这是因为存在一些网络瓶颈。这是因为:
- 发送的数据包非常大。
- 网速慢。
要缓解,请尝试optimize sending packets,IE只发送所需的数据。例如,如果我有一个带有移动和非移动组件的游戏,即使您可能多次发送移动组件,也只发送一次非移动组件。
另一种选择是诊断网络,这超出了此stackoverflow问题的范围。
然而,尽管这些是“事实”,但是根据我自己的经验,有一些非传统的或小的调整似乎可以解决这个问题。
- 摆脱emit函数的JSON.stringify。 Socket.emit会自动为您完成此操作。
- 将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();
回答如下:
这是因为存在一些网络瓶颈。这是因为:
- 发送的数据包非常大。
- 网速慢。
要缓解,请尝试optimize sending packets,IE只发送所需的数据。例如,如果我有一个带有移动和非移动组件的游戏,即使您可能多次发送移动组件,也只发送一次非移动组件。
另一种选择是诊断网络,这超出了此stackoverflow问题的范围。
然而,尽管这些是“事实”,但是根据我自己的经验,有一些非传统的或小的调整似乎可以解决这个问题。
- 摆脱emit函数的JSON.stringify。 Socket.emit会自动为您完成此操作。
- 将setTimeout放在函数的开头,而不是结尾。
另外,确保socketsList[player.id]
是玩家的实际套接字。如果你在某些时候使用socketsList.splice,它会使索引陷入困境,使它将数据包发送到错误的客户端。