[Урок] Таймеры и их количество

iTrue

• Зарегистрированный •
Регистрация
7 Авг 2018
Сообщения
20
Реакции
1
Здраствуйте уважаемые коллеги.
Сегодня я хочу рассказать вам почему не стоит использовать множество таймеров.​


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



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



По стандарту сервер получает обновление каждые 5 миллисекунд.
Вывод о этом можно сделать изходя из значение sleep которое ровно 5.
Свойственно сервер по умолчанию в идеале выполняет 200 ProgressTick в секунду.


А теперь вернемся к таймерам.
Предположим у нас играет 1000 человек. На каждого из которых мы создаем по 1 таймеру SetTimerEx.
Что мы получаем на выходе? Порядком 200000 проверок на таймер в секунду. [1000 * 200 = 200000].
А теперь предположим что у нас на игрока создан далеко не 1 таймер, а допустим 5.
Что получим? Да особо ничего, всего порядком миллиона проверок на таймеры игрока в секунду. [((1000 * 200) * 5) = 1.000.000
Не стоит забывать что pawn медлителен, и в примерных значениях 1 миллион проверок будет равен примерно циклу в 100.000 итераций на секунду



Cразу хочу сказать слово о оборудование.
Если вы думаете что более мощное оборудование исправит вашу ситуацию, то вы от части ошибаетесь.
Взяв оборудование с процессором 2.5GHz или 3.5GHz разница будет настолько мала, что в большей степени вы зря потратите свои деньги




Какой вывод стоит сделать из всего вышесказанного?​
Не слушать людей которые говорят таймеры нагрузки не несут а несет ее только код в таймере.
Использовать 1 глобальный таймер с циклов на MAX_PLAYERS или GetPlayerPoolSize, с хорошей и правильной структурой кода


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

Спасибо за внимание​
 
Последнее редактирование:

iTrue

• Зарегистрированный •
Регистрация
7 Авг 2018
Сообщения
20
Реакции
1
Спасибо, поправил
SetTimerEx как бы -_-
может быть ГИГА герц?
Забыл сразу сказать​
Не стоит забывать что pawn медлителен, и в примерных значениях 1 миллион проверок будет равен примерно циклу в 100.000 итераций на секунду

Это можно измерить с помощью цикла скажем на 50 тысяч итераций на pawn и к примеру c++​
 
Последнее редактирование:

ihNNNNNify

Заблокирован
Регистрация
18 Июн 2014
Сообщения
2,390
Реакции
375
Ничего нового из этого урока я не узнал, спасибо.
 

The Zaka

Участник форума
Пользователь
Регистрация
18 Апр 2017
Сообщения
357
Реакции
33
Интересно, знаю код одного крупного проекта и у них там на каждый случай выделяется по индивидуальному таймеру и все хорошо:ah:
 

iTrue

• Зарегистрированный •
Регистрация
7 Авг 2018
Сообщения
20
Реакции
1
Интересно, знаю код одного крупного проекта и у них там на каждый случай выделяется по индивидуальному таймеру и все хорошо:ah:
Интересно что у них за проект и какой у них тикрейт?)
Даже при тикрейте 100 обновление сервера произходит раз в 10 миллисекунд, соответственно лагов не будет видно.
Но убрать такие выделения таймеров и тикрейт он знатно подрастет.


Не удивляюсь что у многих проектов во главе стоят нубасы.
Не удаляя этому должного внимания выйдет что то на подобие лагающей Аризоны.
Только не стоит забывать что это они еще переехали на новое оборудование стоимостью свыше 900 долларов что немного избавляет их от этих лагов
 
Последнее редактирование:

whale

/proger/
Регистрация
20 Сен 2013
Сообщения
1,052
Реакции
365
Никто и не говорил, что таймеры не несут нагрузки. Но эта нагрузка практически незаметна, в сравнении с качеством кода, выполняемого внутри таймера, которое куда более важно.
 

iTrue

• Зарегистрированный •
Регистрация
7 Авг 2018
Сообщения
20
Реакции
1
Никто и не говорил, что таймеры не несут нагрузки. Но эта нагрузка практически незаметна, в сравнении с качеством кода, выполняемого внутри таймера, которое куда более важно.
Ты не понимаешь суть темы похоже.
Из-за таймеров ты теряешь тикрейт. Низкий тикрейт == микролаги, очень низкий тикрейт сервера = лаги.
Создай 100 таймеров даже без кода в них или запихни к примеру NexAc те же 5-10к строк кода)
Проверь это на онлайне 500-1000. Как думаешь из-за чего сервер будет больше лагать?)
 

Russ

Участник форума
Пользователь
Регистрация
18 Окт 2016
Сообщения
293
Реакции
24
Автор не знает о чем пишет!
 

iTrue

• Зарегистрированный •
Регистрация
7 Авг 2018
Сообщения
20
Реакции
1
Автор не знает о чем пишет!
О этом мне говорит человек наверное с самой высокой минусовой репутацией на форуме.
Сразу говорит о том что вы мастер своего дела.


Прежде чем говорить о том что я несу бред, достаточно сделать тесты.

В таких моментах мне становится жаль что нет права на бан таких юзеров которые слушают всякое …. а потом это еще и втюхивают всем <<<< Это про тебя
 

Russ

Участник форума
Пользователь
Регистрация
18 Окт 2016
Сообщения
293
Реакции
24
О этом мне говорит человек наверное с самой высокой минусовой репутацией на форуме.
Сразу говорит о том что вы мастер своего дела.


Прежде чем говорить о том что я несу бред, достаточно сделать тесты.

В таких моментах мне становится жаль что нет права на бан таких юзеров которые слушают всякое …. а потом это еще и втюхивают всем <<<< Это про тебя
Ты почему такое наивное то xD на репу смотришь. Репутация у меня такая только потому что высказал царю свое мнение о нем в ответ получил такую репутацию ну и местные обиженки постарались, которых я хейтил. Ну а по поводу темы ты не чего не понимаешь и пишешь бред+ тебя поправили "SetTimerEx как бы -_-", а ты снова пишешь непонятно что "SetPlayerEx"
И, если ты о тестах заговорил, то предоставь их данные раз всем навязываешь свою идею.
 

The Zaka

Участник форума
Пользователь
Регистрация
18 Апр 2017
Сообщения
357
Реакции
33
Интересно что у них за проект и какой у них тикрейт?)
Даже при тикрейте 100 обновление сервера произходит раз в 10 миллисекунд, соответственно лагов не будет видно.
Но убрать такие выделения таймеров и тикрейт он знатно подрастет.


Не удивляюсь что у многих проектов во главе стоят нубасы.
Не удаляя этому должного внимания выйдет что то на подобие лагающей Аризоны.
Только не стоит забывать что это они еще переехали на новое оборудование стоимостью свыше 900 долларов что немного избавляет их от этих лагов
Не помню точно, trinity / evolve чет такое, короче

---------- Сообщение добавлено в 14:32 ---------- Предыдущее сообщение добавлено в 14:19 ----------

И помнится мне на Evolve в onplayertext вызывается индивидуальный таймер со временем умноженное на количество символов для сброса анимации. И что ты скажешь про это?:ds:
 

execution

Участник форума
Пользователь
Регистрация
23 Июн 2017
Сообщения
357
Реакции
54
Имея онлайн 150 и при этом переведя на индивидуальный таймер - лаги заметно ушли.
 

Nexius_Tailer

• Профик •
Регистрация
19 Май 2013
Сообщения
1,586
Реакции
746
Что мы получаем на выходе? Порядком 200000 проверок на таймер в секунду. [1000 * 200 = 200000.
А теперь предположим что у нас на игрока создан далеко не 1 таймер, а допустим 5.
Что получим? Да особо ничего, всего порядком миллиона проверок на таймеры игрока в секунду. [((1000 * 200) * 5) = 1.000.000
Не стоит забывать что pawn медлителен, и в примерных значениях 1 миллион проверок будет равен примерно циклу в 100.000 итераций на секунду
Есть какие-либо доказательства, что эти проверки на таймеры идут в pawn коде, а не на более низком уровне? Не думаю.

Какой вывод стоит сделать из всего вышесказанного?

Использовать 1 глобальный таймер с циклов на MAX_PLAYERS или GetPlayerPoolSize, с хорошей и правильной структурой кода
Ну а это уже полный бред. Если бы ты проанализировал, как работает 1 глобальный таймер с циклом (а тем более без foreach), то наверное бы смысл этого "урока" резко бы потерялся.

Ну в принципе кратко объяснить не поленюсь:

1) Имея на сервере, скажем, 500 слотов и онлайн в 200 игроков (с рандомными идами от 0 до 400, т.к. онлайн непостоянен и максимальный ид игрока чаще всего далеко не совпадает с общим количеством игроков в данный момент) с циклом в едином таймере, основанном на MAX_PLAYERS ты пробегаешься по 500 слотам, когда реальных итераций могло быть всего 200. Ты потерял 300 итераций впустую. И, к слову, какая такая "правильная" структура кода, о которой ты упомянул, могла бы изменить это неэффективное решение? Вопрос открыт.

2) Имея на сервере, скажем, 1000 слотов и онлайн в 250 игроков (с рандомными идами от 0 до 600 - представим что сервер ушёл на ночь и онлайн просел) с циклом в едином таймере, основанном на GetPlayerPoolSize ты пробегаешься по 600 слотам, когда реальных итераций могло быть всего 250. Ты потерял 350 итераций впустую. Вопрос из пункта выше всё также открыт.

3) Имея на сервере, скажем, 50 слотов и онлайн в 50 игроков с циклом в едином таймере ты только в этом случае не произведёшь пустые итерации, при том что речь идёт об абсолютно заполненном сервере, что бывает далеко не у всех и далеко не всегда.

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

0xWraith

Заблокирован
Регистрация
28 Сен 2018
Сообщения
43
Реакции
2
О этом мне говорит человек наверное с самой высокой минусовой репутацией на форуме.
Сразу говорит о том что вы мастер своего дела.


Прежде чем говорить о том что я несу бред, достаточно сделать тесты.

В таких моментах мне становится жаль что нет права на бан таких юзеров которые слушают всякое …. а потом это еще и втюхивают всем <<<< Это про тебя
Пфф, разве уровень репутации указывает на уровень скила? Мб проверим?
 

vasyok28

Участник форума
Пользователь
Регистрация
1 Май 2014
Сообщения
102
Реакции
13
Никто не упомянул про выход за пределы массива, тогда таймер пойдет к чертам для всех игроков. А с индивидуальными таймерами будет не так критично для одного игрока
 

iTrue

• Зарегистрированный •
Регистрация
7 Авг 2018
Сообщения
20
Реакции
1
Никто не упомянул про выход за пределы массива, тогда таймер пойдет к чертам для всех игроков. А с индивидуальными таймерами будет не так критично для одного игрока
Тут все зависит от ручонок кодера)
Выход за пределы массива не хорош где бы он не был. Это отказ работы последующего участка кода разумеется.
Я бы сказал это критично где бы выход за пределы массива не был.


Завтра постараюсь подкрепить результаты тестирования, как таймеры влияют на тикрейт сервера.
 
Последнее редактирование:

Richie56

Специалист
Пользователь
Регистрация
1 Май 2014
Сообщения
625
Реакции
195
что 1к индивидуалок, что 1 глобалка на 1к итераций, жрет одинаково, только глобалка жрет рывками из за чего как раз и будут пролаги.
но от части чел прав, не стоит создавать 10к таймеров на серве, ибо их обработка сожрет все ресы.
 

iTrue

• Зарегистрированный •
Регистрация
7 Авг 2018
Сообщения
20
Реакции
1
что 1к индивидуалок, что 1 глобалка на 1к итераций, жрет одинаково, только глобалка жрет рывками из за чего как раз и будут пролаги.
но от части чел прав, не стоит создавать 10к таймеров на серве, ибо их обработка сожрет все ресы.
Не совсем одинаково.
Глобальный таймер он один и сервер проверяет наличие 1 таймера каждый тик, нужно ли его запускать или нет.
А индивидуальных же таймеров много и сервер каждый тик уже проверяет не 1 таймер на запуск а ровно столько, сколько их было создано.
Это аналогично тому же респавну машин, сделав его на серверной части вы увидите прирост к тикрейту, при условие что уберете респавн машин в нативе.
(Имитировать индивидуальный таймер в глобальном вы можете, сделав таймер 50-100-250 мс, роли это особой не сыграет, возрастет мизерная нагрузка на процессор за счет лишний проверки, подошло ли время обработки определенного игрока.

Все это можно протестировать и заметить уже на онлайне 200-300 когда есть существенная нагрузка на оборудование, ресурсы заняты и работают.
Не надо говорить что я провел тест и ресурсов затрачено одинаково.
1. Не стоит делать тесты на винде.
2. Какие тесты можно делать даже на линуксе когда у вашего оборудования нагрузка от одного лиш сервера.

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

Лаги фактически не реально заметить даже на тикрейте 60+
Но когда он 30-40 уже видны задержки и человеческим глазом.
А когда ваш тикрейт упадет еще ниже, вы встречаете одну из частых проблем у многих, пикапы долго подымаются, диалоги долго открываются, и пошло и поехало, а самое заюавное что в данном случае начинают крутить тикрейт стримера, не понимая, что как бы вы не старались, как бы стример не работал, если тикрейт вашего сервера убит в хлам, то быстрого ответа от того же плагина вы не получите.
 

Nexius_Tailer

• Профик •
Регистрация
19 Май 2013
Сообщения
1,586
Реакции
746
Лаги фактически не реально заметить даже на тикрейте 60+
Но когда он 30-40 уже видны задержки и человеческим глазом.
А когда ваш тикрейт упадет еще ниже, вы встречаете одну из частых проблем у многих, пикапы долго подымаются, диалоги долго открываются, и пошло и поехало, а самое заюавное что в данном случае начинают крутить тикрейт стримера, не понимая, что как бы вы не старались, как бы стример не работал, если тикрейт вашего сервера убит в хлам, то быстрого ответа от того же плагина вы не получите.
Так а почему ты это связываешь именно с индивидуальными таймерами? Ты же описываешь низкий тикрейт не как следствие, а как причину, соответственно при низком тикрейте как таковом (по любым иным причинам, не связанным с таймерами в принципе) у тебя с любым вариантом будут все твои перечисленные проблемы.

Не совсем одинаково.
Глобальный таймер он один и сервер проверяет наличие 1 таймера каждый тик, нужно ли его запускать или нет.
А индивидуальных же таймеров много и сервер каждый тик уже проверяет не 1 таймер на запуск а ровно столько, сколько их было создано.
Только вот индивидуальные компенсируют всё это своей распределённой нагрузкой, как уже было написано выше, а проверки на их наличие и их вызов в любом случае производятся не на уровне pawn скрипта, а на гораздо более низком.
 

Пользователи онлайн

Реклама

Сверху