Sign in to follow this  
modernbb

Реальное время на сервере

Recommended Posts

1 час назад, modernbb сказал:

что именно будет загружать ?

Таймер будет загружать CPU.

Share this post


Link to post
Share on other sites
2 минуты назад, N1kS сказал:

Таймер будет загружать CPU.

незнаю у кого что нагружает , лично у меня 2 таймера стоит и нагрузка на цп 0-1%, так же есть несколько сайтов с кучей таймеров и никаких проблем нету

Share this post


Link to post
Share on other sites

setInterval самый нормальный способ создать игровой цикл

  • Sad 1

Share this post


Link to post
Share on other sites
var SyncTime = function (){ //Объявляем функцию синхронизирующую время
    let date = new Date();
    mp.environment.time.hour = date.getHours();
    mp.environment.time.minute = date.getMinutes();  
}

SyncTime();//Синхронизируем время на старте

setTimeout(function(){//Запускаем одноразовый таймер на конец часа
    setInterval(function(){SyncTime()},1000*60*60);//Запускаем в конце часа таймер с интервалом в час для синхронизации
    SyncTime(); 
    },function(){
        let date = new Date();
        return 1000*60*(60-date.getMinutes());
    }
);

На мой взгляд, логичнее сначала  синхронизировать время, запустить таймер черезе N минут до конца часа, а там уже запустить обычный таймер с интервалом срабатывания в один час.
Поправьте, если что-то не так

Edited by ch3rkasov
  • Like 1

Share this post


Link to post
Share on other sites
1 час назад, ch3rkasov сказал:
var SyncTime = function (){ //Объявляем функцию синхронизирующую время
    let date = new Date();
    mp.environment.time.hour = date.getHours();
    mp.environment.time.minute = date.getMinutes();  
}

SyncTime();//Синхронизируем время на старте

setTimeout(function(){//Запускаем одноразовый таймер на конец часа
    setInterval(function(){SyncTime()},1000*60*60);//Запускаем в конце часа таймер с интервалом в час для синхронизации
    SyncTime(); 
    },function(){
        let date = new Date();
        return 1000*60*(60-date.getMinutes());
    }
);

На мой взгляд, логичнее сначала  синхронизировать время, запустить таймер черезе N минут до конца часа, а там уже запустить обычный таймер с интервалом срабатывания в один час.
Поправьте, если что-то не так

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

Share this post


Link to post
Share on other sites
14 часа назад, modernbb сказал:

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

В любом случае, чем каждую секунду обновлять легче интервал поставить на минуту, чем лишние переменные плодить. Ну да ладно.

  • Like 1

Share this post


Link to post
Share on other sites
В 06.01.2017 в 02:27, ch3rkasov сказал:

В любом случае, чем каждую секунду обновлять легче интервал поставить на минуту, чем лишние переменные плодить. Ну да ладно.

Не могу согласиться. Вызов функции (любой) - это всегда нагрузка на сервер, хоть и мизерная. Но по своему опыту на больших проектах могу сказать, что если вообще не думать о нагрузке на сервер - то в какой-то момент ваше приложение начнёт кушать столько ресурсов, что содержание серверов начнёт стоить вам непосильно много денег (nodejs в особенности подвержена данной проблеме), и вам придётся отрефакторить и переписать половину кода с целью оптимизации, и это займёт кучу драгоценного времени. Лучше сразу думать о том, к чему ваш код может привести.

 

Если в конкретно этой задаче запариться над производительностью и учитывать вероятность асинхрона выполнения `setTimeout` и `setInteval` в nodejs, то можно вот так сделать:

// Переменная, куда будет сохраняться setTimeout, чтобы мы могли его очистить по завершению
let timer = 0;

// Непосредственный callback, который будет выполняться в 00 секунд каждой минуты
const changeTime = (currentDate, isFirstRunning) => {
  // Меняем часы и минуты на сервере
  mp.environment.time.hour = currentDate.getHours();
  mp.environment.time.minute = currentDate.getMinutes();
  
  if (!isFirstRunning) {
    // Сюда вписываем логику, которая должна выполняться исключительно в 00 секунд каждой минуты
  }
};

// Функция запуска таймера, которая будет отрабатывать в каждые 00 секунд каждой минуты
const runTimer = (isFirstRunning) => {
  // Получаем текущее время
  // (при каком-то рассинхроне времени в ноде, например, при мелком подвисании сервера, мы синхронизируем время в следующую минуту)
  const currentDate = new Date();
  // Высчитываем оставшееся количество миллисекунд до следующей минуты
  const remainingMilliseconds = (60 - currentDate.getSeconds()) * 1000 + (1000 - currentDate.getMilliseconds());

  // Вызываем callback, который должен выполняться у нас в 00 секунд каждой минуты
  // (первый запуск будет не в 00 секунд, поэтому мы передаём переменную `isFirstRunning` в callback,
  // если нам требуется какая-то дополнительная логика на вызов именно в 00 секунд)
  changeTime(currentDate, !!isFirstRunning);

  // Очищаем предыдущий таймер - советуют так делать, чтобы избежать утечки памяти
  clearTimeout(timer);
  // Сам таймер, который будет запускаться каждый раз
  timer = setTimeout(() => {
    runTimer();
  }, remainingMilliseconds);
};

// Запускаем таймер в первый раз
runTimer(true);

 

Чистый код без комментариев, чтобы вы оценили его минималистичность и простоту:

let timer = 0;

const changeTime = (currentDate, isFirstRunning) => {
  mp.environment.time.hour = currentDate.getHours();
  mp.environment.time.minute = currentDate.getMinutes();
  
  if (isFirstRunning) {
    // Сюда вписываем логику, которая должна выполняться исключительно в 00 секунд каждой минуты
  }
};

const runTimer = (isFirstRunning) => {
  const currentDate = new Date();
  const remainingMilliseconds = (60 - currentDate.getSeconds()) * 1000 + (1000 - currentDate.getMilliseconds());

  changeTime(currentDate, !!isFirstRunning);

  clearTimeout(timer);
  timer = setTimeout(() => {
    runTimer();
  }, remainingMilliseconds);
};

runTimer(true);

 

Edited by Danil_Valov
  • Like 2

Share this post


Link to post
Share on other sites
В 04.01.2017 в 04:30, N1kS сказал:

@modernbb, оформите тему нормально, напишите теги и какие-то банальные комментарии к коду.

Не думаю, что эта тема будет актуальна.(это мое мнение)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.