我需要清除服务器端间隔吗?

时间:2018-11-16 00:10:52

标签: node.js websocket multiplayer

我具有服务器端功能来检查播放器是否空闲

socket.idle = 0;
socket.cached = {};
socket.checkIdle = function(){
   socket.idle++;
   console.log(socket.idle);
   if(socket.cached.x != players[id].x || socket.cached.y != players[id].y){
      socket.idle=0;
   }
   socket.cached = players[id];
   if(socket.idle>12){
      socket.disconnect();
   }
}

socket.interval = setInterval(socket.checkIdle,1000);

我注意到,即使播放器启动/断开连接的时间过长。服务器仍在控制台为它记录socket.idle。

我会以错误的方式处理吗?然后我还应该清除播放器断开连接的时间间隔吗?

socket.on('disconnect', function(){
   clearInterval(socket.interval);
});

1 个答案:

答案 0 :(得分:0)

您当然不应该让setInterval()在不再连接的播放器上运行。您的服务器将越来越多地运行这些服务器,浪费CPU周期,并可能影响服务器的响应能力或可伸缩性。

  

我注意到,即使播放器启动/断开连接的时间过长。服务器仍在控制台为它记录socket.idle。

是的,这是因为该间隔仍在运行,并且实际上,它甚至可以防止套接字对象被垃圾回收。所有这些都是不好的。

  

然后我还应该清除播放器断开连接的时间间隔吗?

是的,当套接字断开连接时,必须清除与该套接字关联的间隔计时器。

  

我会以错误的方式处理吗?

如果您保持每个单独套接字的轮询间隔计时器的体系结构,那么这是在套接字断开连接时清除计时器的正确方法。

但是,我认为也许您可以提出另一种设计,而该设计根本不需要定期“轮询”空闲状态。看来您希望有12秒的超时时间,以便如果播放器在12秒内没有移动,那么您将断开用户连接。真的没有理由每秒检查一次。从用户连接起,您只需在setTimeout()中设置一个计时器,持续12秒钟,然后每次您收到播放器移动的通知(由于必须在{{1 }}和players[id].x),您只需清除旧计时器并设置一个新计时器即可。计时器启动后,您必须走了12秒钟才保持静止,然后才能断开连接。这通常是超时类型计时器的工作方式。