a_timer -
XemyL - 13.04.2013
Этот инклуд добавляет новые функции для работы с таймерами:
PHP код:
TSetTimer(const funcname[], interval, repeating)
TKillTimer(timerid)
С помощью этих функций можно использовать точные таймеры, гораздо точнее стандартных.
+ На данный момент самый точный способ использования таймеров
- Для таймеров, меньше 250 мс точность не гарантируется при стандартных параметрах. Можно изменить параметр UPDATE_TIMERS на требуемое число и тогда точность будет, но сервер будет сильнее нагружатся. Уменьшать этот параметр крайне не желательно!
Пользоваться этим инклудом очень легко. Всё точно так же как и стандартными таймерами, только для запуска нужно использовать TSetTimer(название функции, время, повторение (0\1)), а для отключения TKillTimer(ID таймера).
Тесты точности таймеров проводились на повторяющемся минутном таймере. В стандартных таймера при увеличении времени таймера отклонение так же увеличивалось. С a_timer отклонение будет всегда одинаковое.
Стандартные таймеры: Отклонение 4746-4920 мс
a_timer: Отклонение 0-250 мс
Внимание! Перед использованием изменить в инклуде параметр MAX_TIMERS на нужное значение!
http://pastebin.com/idUmmFzR
Re: a_timer -
Stepashka - 13.04.2013
Выложи пожалуйста на
http://pastebin.com/
Re: a_timer -
XemyL - 13.04.2013
Выложил.
Re: a_timer -
AirKite - 13.04.2013
Во первых таймеры не тормозят, а тормозят ваши потоки. Во вторых код полная херня. Вы даже не подумали о TimerID при удалении таймера.
pawn Код:
stock KillTimerEx(timerid) TimerInterval[timerid] = 0;
Таким образом выходит MAX_TIMERS общее не рациональное количество использования функции TSetTimer а не таймеров вообще. т.е. создав 10 таймеров, удалив из них 9 таймеров, 9 слотов не освободятся.
p.s. Если ваши таймеры (стандартные) дают погрешности больше 50ms, то у вас плохой код. Большие интервалы не замеряют SetTimer("name", много_времени, true\false), gettime вам в помощь. Вообще задержка таймера это показатель скорости выполнения потока. Чем больше задержка, тем больше лагов на сервере, таймер лишь указывает вам на это а не создаёт эти лаги.
Re: a_timer -
XemyL - 13.04.2013
Quote:
Originally Posted by AirKite
Во первых таймеры не тормозят, а тормозят ваши потоки. Во вторых код полная херня. Вы даже не подумали о TimerID при удалении таймера.
pawn Код:
stock KillTimerEx(timerid) TimerInterval[timerid] = 0;
Таким образом выходит MAX_TIMERS общее не рациональное количество использования функции TSetTimer а не таймеров вообще. т.е. создав 10 таймеров, удалив из них 9 таймеров, 9 слотов не освободятся.
p.s. Если ваши таймеры (стандартные) дают погрешности больше 50ms, то у вас плохой код. Большие интервалы не замеряют SetTimer("name", много_времени, true\false). Вообще задержка таймера это показатель скорости выполнения потока. Чем больше задержка, тем больше лагов на сервере, таймер лишь указывает вам на это а не создаёт эти лаги.
|
Мой код? Смищно. Тесты проводились на чистом моде. Код показать?
Слоты поправлю сейчас...
Re: a_timer -
XemyL - 13.04.2013
Обновил код. Исправил ошибку со слотами.
Re: a_timer -
frog163 - 13.04.2013
А зачем эта точность? Точно нужно считать только время(именно текущее физическое время), но оно узнается не с помощью таймеров, а с помощью функции gettime.
PHP код:
SetTimer("UpdateTimers", TIMERS_UPDATE, 1)
Как ты вообще можешь узнать точность выполнения таймера на 100мс с помощью такого же таймера на 100мс?
Re: a_timer -
XemyL - 13.04.2013
Запусти таймер минут на 10, а он пройдёт через 12-15, в лучшем случае. Как то не очень хорошо.
Точность легко измеряется вот так:
PHP код:
public OnGameModeInit()
{
Time = GetTickCount();
SetTimer("Timer1Start", 60000, 1);
return true;
}
public Timer1Start()
{
printf("Отклонение = %d ms", GetTickCount()-Time-60000);
return 1;
}
Re: a_timer -
frog163 - 13.04.2013
Не получил ответ. Зачем все таки измерять таймеры точно? Зачем это может понадобиться? Почему для тебя это "как то не хорошо"?
Re: a_timer -
XemyL - 13.04.2013
Обычно это достаточный аргумент. Тебя я не заставляю пользоваться инклудом, многим пригодится.
А лично я считаю, что когда указываешь во времени 10 минут, то и выполнится он должен через 10 минут, а не 15.
Re: a_timer -
OKStyle - 13.04.2013
Я в шоке с некоторых вопросов к автору темы. Точные таймеры - недосягаемая идеальная цель. Автор максимально приблизил время выполнения таймеров к "нормальному".
Re: a_timer -
stabker - 13.04.2013
1. Количество массивов можно уменьшить
2. Удаление таймера сделано не правильно. После "удаления" таймер будет срабатывать каждые TIMERS_UPDATE
3. Переменная TimerID используется не правильно, поэтому в конце концов будет происходить обращение к несуществующей ячейке
Re: a_timer -
XemyL - 13.04.2013
Quote:
Originally Posted by stabker
1. Количество массивов можно уменьшить
2. Удаление таймера сделано не правильно. После "удаления" таймер будет срабатывать каждые TIMERS_UPDATE
3. Переменная TimerID используется не правильно, поэтому в конце концов будет происходить обращение к несуществующей ячейке
|
Блин... Я видимо ссылки перепутал. AirKite уже об этом говорил, а я исправлял. Только не то что то... Сейчас перезалью.
----------
Готово.
Re: a_timer -
OKStyle - 13.04.2013
А разве не нужен такой дефайн ещё:
pawn Code:
#define KillTimer KillTimerEx
Re: a_timer -
Alexander_Petrov - 13.04.2013
Quote:
Originally Posted by OKStyle
А разве не нужен такой дефайн ещё:
pawn Code:
#define KillTimer KillTimerEx
|
SetTimerEx же не заменяется в инклуде.
Re: a_timer -
stabker - 13.04.2013
Quote:
Originally Posted by OKStyle
А разве не нужен такой дефайн ещё:
pawn Code:
#define KillTimer KillTimerEx
|
Он не сделал его из-за того, что таймер может быть создан через SetTimerEx
UPD: Alexander_Petrov, я одновременно с вами сообщение отправил. Это не специально
Re: a_timer -
XemyL - 13.04.2013
Quote:
Originally Posted by OKStyle
А разве не нужен такой дефайн ещё:
pawn Code:
#define KillTimer KillTimerEx
|
Нет. Я там написал что к сожалению, SetTimerEx я заменить не смог. Поэтому он работает по стандарту.
KillTimer чтобы убить SetTimerEx
KillTimerEx чтобы убить таймеры на a_timer (SetTimer)
Re: a_timer -
OKStyle - 13.04.2013
А, вон оно как.
Re: a_timer -
stabker - 13.04.2013
UPD: Предлагаю такой вариант
http://pastebin.com/qfnMv3UZ
Работоспособность не тестировал
Re: a_timer -
frog163 - 14.04.2013
Quote:
Originally Posted by XemyL
Обычно это достаточный аргумент. Тебя я не заставляю пользоваться инклудом, многим пригодится.
А лично я считаю, что когда указываешь во времени 10 минут, то и выполнится он должен через 10 минут, а не 15.
|
Т.е. тебе этот инклуд тоже не нужен?)
Пойми, я же не наезжаю на тебя
Инклуд работает (без теста понятно), просто хочу узнать для каких целей/задачи, конкретно в сампе/павн, это
необходимо?