Нужно ли очищать серверные интервалы? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть функция на стороне сервера, чтобы проверить, не занят ли игрокСервер по-прежнему консольно записывает в него файл socket.idle.

Я поступаю неправильно?Также я должен тогда очистить интервал, когда игрок отключается?

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

1 Ответ

0 голосов
/ 16 ноября 2018

Вы, конечно, не должны оставлять setInterval() запущенным для игрока, который больше не подключен. На вашем сервере будет работать все больше и больше, тратя циклы ЦП и, возможно, влияющие на скорость отклика вашего сервера или масштабируемость.

Я заметил, что даже после того, как плеер слишком долго загружается / отключается. Сервер по-прежнему консольно регистрирует для него socket.idle.

Да, это потому, что интервал все еще работает и, фактически, он даже не позволяет объекту сокета собирать мусор. Все это плохо.

Кроме того, я должен затем очистить интервал, когда игрок отключается?

Да, когда сокет отключается, вы должны очистить интервальный таймер, связанный с этим сокетом.

Я поступаю неправильно?

Если вы используете архитектуру таймера интервала опроса для каждого отдельного сокета, то это правильный способ очистки таймера при отключении сокета.

Но, я думаю, что, возможно, вы могли бы придумать другой дизайн, который вообще не должен регулярно "опрашивать" на предмет простоя. Похоже, вы хотите иметь 12-секундный тайм-аут, чтобы, если игрок не двигался в течение 12 секунд, вы отключаете пользователя. Там действительно нет причин проверять это каждую секунду. Вы можете просто установить один таймер с помощью setTimeout() на 12 секунд с момента подключения пользователя, а затем каждый раз, когда вы получаете уведомление о перемещении игрока (о котором ваш сервер уже должен быть уведомлен, так как вы ссылаетесь на него в players[id].x и players[id].y), вы просто очищаете старый таймер и устанавливаете новый. Когда таймер срабатывает, у вас должно быть 12 секунд без движения, и вы можете отключиться. Это будет более типично, как таймер типа таймаута будет работать.

...