【问题标题】:Do I need to clear server side intervals?我需要清除服务器端间隔吗?
【发布时间】:2018-11-16 00:10:51
【问题描述】:

我有一个服务器端功能来检查玩家是否空闲

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);
});

【问题讨论】:

    标签: node.js websocket multiplayer


    【解决方案1】:

    您当然不应该让setInterval() 为不再连接的玩家运行。您的服务器将有越来越多的此类运行,浪费 CPU 周期并可能影响服务器的响应能力或可扩展性。

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

    是的,那是因为间隔仍在运行,事实上,它甚至阻止了套接字对象被垃圾收集。所有这些都很糟糕。

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

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

    我是不是走错了路?

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

    但是,我认为也许您可以提出另一种根本不需要定期“轮询”空闲的设计。看来您希望有 12 秒的超时时间,这样如果玩家在 12 秒内没有移动,那么您将断开用户的连接。真的没有理由每秒检查一次。您可以使用setTimeout() 设置一个计时器,从用户连接时开始持续 12 秒,然后每次收到玩家移动通知(您的服务器必须已经收到通知,因为您在 players[id].x 和 @ 中引用它987654324@),你只需清除旧计时器并设置一个新计时器。当计时器触发时,您必须有 12 秒没有动作,然后您才能断开连接。这将是超时类型计时器更典型的工作方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      相关资源
      最近更新 更多