Вы, конечно, не должны оставлять setInterval()
запущенным для игрока, который больше не подключен. На вашем сервере будет работать все больше и больше, тратя циклы ЦП и, возможно, влияющие на скорость отклика вашего сервера или масштабируемость.
Я заметил, что даже после того, как плеер слишком долго загружается / отключается. Сервер по-прежнему консольно регистрирует для него socket.idle.
Да, это потому, что интервал все еще работает и, фактически, он даже не позволяет объекту сокета собирать мусор. Все это плохо.
Кроме того, я должен затем очистить интервал, когда игрок отключается?
Да, когда сокет отключается, вы должны очистить интервальный таймер, связанный с этим сокетом.
Я поступаю неправильно?
Если вы используете архитектуру таймера интервала опроса для каждого отдельного сокета, то это правильный способ очистки таймера при отключении сокета.
Но, я думаю, что, возможно, вы могли бы придумать другой дизайн, который вообще не должен регулярно "опрашивать" на предмет простоя. Похоже, вы хотите иметь 12-секундный тайм-аут, чтобы, если игрок не двигался в течение 12 секунд, вы отключаете пользователя. Там действительно нет причин проверять это каждую секунду. Вы можете просто установить один таймер с помощью setTimeout()
на 12 секунд с момента подключения пользователя, а затем каждый раз, когда вы получаете уведомление о перемещении игрока (о котором ваш сервер уже должен быть уведомлен, так как вы ссылаетесь на него в players[id].x
и players[id].y
), вы просто очищаете старый таймер и устанавливаете новый. Когда таймер срабатывает, у вас должно быть 12 секунд без движения, и вы можете отключиться. Это будет более типично, как таймер типа таймаута будет работать.