PDA

Просмотр полной версии : [Вопрос] Новый таймер и когда стоит его создавать



Elrmrnt-Kritik
14.09.2018, 23:49
Добрый вечер. Часто сталкиваюсь с вопросом, стоит ли создавать новый таймер, или "засунуть" нужные мне действия в уже имеющиеся. Так, например, в секундном таймере игрока происходит обновление данных о его состоянии (сколько осталось сидеть в тюрьме, сколько осталось мута, сохранение позиции), находятся какие-то проверки, связанные с работами (не ушел ли игрок далеко от места работы). И.. Таких вещей в целом получается много. Так вот, когда же лучше создавать новый таймер для чего-либо, а когда использовать имеющийся? Хотел бы создать для себя четкое представление, чтобы не задумываться: а как мне быть? Создавать новый или нет?

Nexius_Tailer
15.09.2018, 11:35
Индивидуальные таймеры однозначно лучше в тех случаях, когда основной таймер с циклом на всех игроков перебирает все слоты, а реальный онлайн занимает гораздо меньше, чем есть слотов на этом сервере (и этот цикл не использует foreach). Если же используется foreach или сервер забит игроками полностью - цикл не будет терять лишнее время на левые слоты и тут уже всё зависит от твоего желания, где держать код.

Хотя я бы всё равно разделял нагрузку по нескольким таймерам, ибо множество маленьких задержек (от выполнения кода в индивидуальных таймерах) будет явно гораздо менее заметно, чем одна, но большая задержка в общем таймере.

X!X
15.09.2018, 16:28
Используй динамические зоны в проверке радиуса нахождения на работе:blush2:
Мой знакомый держит сервер с 120 онлайном на индивидуальных таймерах, то есть для каждого игрока отдельно

Elrmrnt-Kritik
15.09.2018, 19:51
Да причем здесь то, как реализовывать эти проверки? Меня интересует то, как лучше использовать таймера. Создавать новый таймер для новых действий (один таймер для работ, один для сохранения/обновления данных каких-то игрока, один еще для чего-нибудь), либо лучше все помещать в один. Здесь же стоит учитывать то, насколько нагружают действия внутри таймера.

И превосходство индивидуальных таймеров очевидно (я на то в шапке темы и писал "секундном таймере игрока", то есть индивидуальном).

DeimoS
16.09.2018, 01:02
Использовать индивидуальные таймеры или один общий - не скажу, ибо всё зависит от многих факторов, начиная с того, на какой машине будет запускаться сервер, и заканчивая тем, сколько всего будет таймеров. Сами по себе таймеры жрут лишь оперативку. Её априори не может быть больше 4 гигов, так как сервер на 32-битной основе. А если ещё и брать в аренду не выделенную машину, а просто хостинг, то мощности той самой машины могут разделяться на неопределённое количество серверов, тем самым реальное количество доступной оперативы может заметно отличаться от того, которое указано в описании хостинга. Собственно, нужно оценивать всё это и уже решать. Хотя я бы старался максимально разделять все действия с одинаковыми временными интервалами (то бишь, если у меня есть несколько систем, которые работают на протяжении всего времени нахождения игрока на сервере, то логично засунуть их в один таймер. Но если есть ещё одна система с тем же временным промежутком, но срабатывать она должна только при определённом условии, то можно уже подумать о том, чтоб убрать её в отдельный таймер). И уже если начнутся краши, быстренько переписать всё под меньшее число таймеров (благо это будет не трудно, если нормально код оформить).

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

Вообще лучшим решением будет использование плагинов, которые реализуют таймеры на своей стороне. Там и точность есть, и другие, довольно критичные, проблемы таймеров исправлены.

Daniel_Cortez
16.09.2018, 12:09
Но что я могу сказать точно, так это то, что не стоит пользоваться параметром "repeat" там, где в функции, вызываемые таймером, передаётся много данных в качестве аргументов и где этот таймер рано или поздно нужно "убить" до рестарта.
От количества передаваемых данных там мало что зависит, структура таймера сама по себе достаточно раздутая. В Pawn название функции может быть длиной до 31 символа, но в таймерах под название зачем-то выделяется массив в 255 ячеек. Это не говоря уже о том, что гораздо быстрее можно добиться израсходования памяти в секции стека/кучи скрипта, передавая через таймер строки и массивы.
http://wiki.pro-pawn.ru/wiki/SetTimerEx

DeimoS
16.09.2018, 14:17
От количества передаваемых данных там мало что зависит, структура таймера сама по себе достаточно раздутая. В Pawn название функции может быть длиной до 31 символа, но в таймерах под название зачем-то выделяется массив в 255 ячеек. Это не говоря уже о том, что гораздо быстрее можно добиться израсходования памяти в секции стека/кучи скрипта, передавая через таймер строки и массивы.
http://wiki.pro-pawn.ru/wiki/SetTimerEx

Именно строки с массивами я и имел в виду :)