N1kS 30 Posted January 4, 2017 1 час назад, modernbb сказал: что именно будет загружать ? Таймер будет загружать CPU. Share this post Link to post Share on other sites
modernbb 13 Posted January 4, 2017 2 минуты назад, N1kS сказал: Таймер будет загружать CPU. незнаю у кого что нагружает , лично у меня 2 таймера стоит и нагрузка на цп 0-1%, так же есть несколько сайтов с кучей таймеров и никаких проблем нету Share this post Link to post Share on other sites
modernbb 13 Posted January 4, 2017 setInterval самый нормальный способ создать игровой цикл 1 Share this post Link to post Share on other sites
ch3rkasov 2 Posted January 4, 2017 (edited) 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 January 4, 2017 by ch3rkasov 1 Share this post Link to post Share on other sites
modernbb 13 Posted January 4, 2017 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
Kowalski 0 Posted January 4, 2017 Вроде как нормальный код Share this post Link to post Share on other sites
ch3rkasov 2 Posted January 5, 2017 14 часа назад, modernbb сказал: можно и так, у каждого свой подход, но раз в час это не так приятно для игрока В любом случае, чем каждую секунду обновлять легче интервал поставить на минуту, чем лишние переменные плодить. Ну да ладно. 1 Share this post Link to post Share on other sites
Danil_Valov 22 Posted January 7, 2017 (edited) В 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 January 8, 2017 by Danil_Valov 2 Share this post Link to post Share on other sites
M4rK 3 Posted January 13, 2017 В 04.01.2017 в 04:30, N1kS сказал: @modernbb, оформите тему нормально, напишите теги и какие-то банальные комментарии к коду. Не думаю, что эта тема будет актуальна.(это мое мнение) Share this post Link to post Share on other sites