Как предовратить повторный запуск таймера? -
stabker - 21.04.2012
Суть вопроса в том, что я хочу оптимизировать спидометр. Делаю запуск таймера для обновления спидометра когда игрок садится в транспорт, останавливаю его когда выходит.
Сделал это так:
в newstate == PLAYER_STATE_DRIVER поставил старт, а oldstate == PLAYER_STATE_DRIVER остановку (удаление)
Также дополнительно останавливаю таймер при выходе из игры.
Но проблема в том, что иногда таймер запускается несколько раз и id нового таймера хранится в переменной, а старого нет, но он все еще работает. Понятно что таймер обновляет текстдравы скорости, бензина и т.д., а когда их несколько то бензин снимается быстрее в столько раз, сколько и запущено лишних таймеров (обычно не более 2х). Удалить "гуляющий" таймер который уже выпал из переменной нельзя, задаюсь вопросом как сделать чтобы он не мог запустится несколько раз?
P.S. Если есть другое решение проблемы, буду очень рад его выслушать
Re: Как предовратить повторный запуск таймера? -
OKStyle - 21.04.2012
Делать таймер без повтора и запускать каждую итерацию с проверкой на положение (вне авто или в нём).
Re: Как предовратить повторный запуск таймера? -
stabker - 21.04.2012
Quote:
Originally Posted by OKStyle
Делать таймер без повтора и запускать каждую итерацию с проверкой на положение (вне авто или в нём).
|
Тоесть это нужно запускать таймер без повтора, в этом же таймере, в конце, сделать проверку на положение и если оно равно PLAYER_STATE_DRIVER то опять запускать таймер?
Не будет ли такой "цикл запусков" слишком нагружать сервер?
Re: Как предовратить повторный запуск таймера? -
OKStyle - 21.04.2012
Гораздо меньше, чем повторяющийся таймер. Коллизий точно не будет.
Re: Как предовратить повторный запуск таймера? -
jhonyxakep - 21.04.2012
А я бы вообще без таймеров делал. ИМХО 2 условия в OnPlayerUpdate отлично подойдут. И не говорите мне, что бла бла нельзя в OnPlayerUpdate. Предположим, что у нас таймер игрока 40 мсек, обновлять спидометр надо раз в 100 мсек, можно спокойно раз в 2-3 OnPlayerUpdate обновлять спидометр.
Re: Как предовратить повторный запуск таймера? -
stabker - 22.04.2012
Quote:
Originally Posted by jhonyxakep
А я бы вообще без таймеров делал. ИМХО 2 условия в OnPlayerUpdate отлично подойдут. И не говорите мне, что бла бла нельзя в OnPlayerUpdate. Предположим, что у нас таймер игрока 40 мсек, обновлять спидометр надо раз в 100 мсек, можно спокойно раз в 2-3 OnPlayerUpdate обновлять спидометр.
|
И не говорите мне, что бла бла нельзя в OnPlayerUpdate... - а я скажу всетаки что нельзя. У меня таймер каждые 300 мсек выполняется, на сек грубо говоря 3 раза. OnPlayerUpdate выполняется около 7-9 раз на секунду если я не ошибаюсь и все это время надо обновлять тексдравы? А если еще учитывать то что у меня там проверка на скорость для античита и т.д. то вряд ли что-то хорошее получится.
Re: Как предовратить повторный запуск таймера? -
Jon_De - 22.04.2012
Всё в OnPlayerUpdate можно, в меру конечно. А против говорят в основном те кто даже не тестировал код при онлайне
Re: Как предовратить повторный запуск таймера? -
iEnemY - 22.04.2012
Я возражу. У меня спидометр в OnPlayerUpdate - но: после использования спидометра (обновления тексдрава), ставится таймер, блокирующий спидометр на 500 мс. Т.е., спидометр выполняется 2 раза в секунду. Но всё равно таймер то используется.. плюс, OnPlayerUpdate очень динамичный - он может выполнятся 2 раза в секунду, а может и 20 - например, когда игрок целится.
Re: Как предовратить повторный запуск таймера? -
Mutha_X - 22.04.2012
Главное отрегулировать частоту вызова onplayerupdate - стандартных конфигов вполне досточно.
Re: Как предовратить повторный запуск таймера? -
jhonyxakep - 23.04.2012
Quote:
И не говорите мне, что бла бла нельзя в OnPlayerUpdate... - а я скажу всетаки что нельзя. У меня таймер каждые 300 мсек выполняется, на сек грубо говоря 3 раза. OnPlayerUpdate выполняется около 7-9 раз на секунду если я не ошибаюсь и все это время надо обновлять тексдравы? А если еще учитывать то что у меня там проверка на скорость для античита и т.д. то вряд ли что-то хорошее получится.
|
Сделайте переключатель. Я об этом в своем посте и говорил. Условие+переменная+код изменения значения переменной позволит избавится от таймера, и запихать все в OnPlayerUpdate
Re: Как предовратить повторный запуск таймера? -
stabker - 23.04.2012
Quote:
Originally Posted by jhonyxakep
Сделайте переключатель. Я об этом в своем посте и говорил. Условие+переменная+код изменения значения переменной позволит избавится от таймера, и запихать все в OnPlayerUpdate
|
Но он не всегда выполняется одинаковое количество раз. К примеру, я двигаюсь, действие выполняется 20 раз в секунду, делаю обновление спидометра на каждый 7. Если отстановится выполнится примерно 2-3 раза в сек. Тоесть если я буду ехать, потом остановлюсь у меня скорость обновится через несколько секунд. Теперь если о самих функциях спидометра говорить, он будет жрать разное количество бензина.
Re: Как предовратить повторный запуск таймера? -
jhonyxakep - 23.04.2012
Quote:
Но он не всегда выполняется одинаковое количество раз. К примеру, я двигаюсь, действие выполняется 20 раз в секунду, делаю обновление спидометра на каждый 7. Если отстановится выполнится примерно 2-3 раза в сек. Тоесть если я буду ехать, потом остановлюсь у меня скорость обновится через несколько секунд.
|
Неужели я был не прав? По моему OnPlayerUpdate выполняется регулярно.
Re: Как предовратить повторный запуск таймера? -
OKStyle - 24.04.2012
Нет, интенсивность обновления инфы об игроке зависит от его поведения. У стоящего игрок - 1 раз в секунду апдейт, у бегущего - чаще, у дерущегося - ещё чаще.
Re: Как предовратить повторный запуск таймера? -
jhonyxakep - 24.04.2012
Quote:
Нет, интенсивность обновления инфы об игроке зависит от его поведения. У стоящего игрок - 1 раз в секунду апдейт, у бегущего - чаще, у дерущегося - ещё чаще.
|
Как можно спровоцировать вызов этого коллбека на клиенте? Просто у меня на сервере он действительно регулярно запускается
Re: Как предовратить повторный запуск таймера? -
OKStyle - 24.04.2012
В OnPlayerUpdate поставь вывод текста в чат с GetTickCount и смотри интервал.
Re: Как предовратить повторный запуск таймера? -
stabker - 24.04.2012
Quote:
Originally Posted by OKStyle
Нет, интенсивность обновления инфы об игроке зависит от его поведения. У стоящего игрок - 1 раз в секунду апдейт, у бегущего - чаще, у дерущегося - ещё чаще.
|
У стоящего игрока на ногах апдейт 2 раза в секунду.
Но мы говорим щас о транспорте, а там даже если игрок стоит на месте действие всеравно выполняется более 10 раз на секунду.
P.S. Я тоже кстати в сообщении выше ошибся, думал когда стоишь оно выполняется только несколько раз на секунду (в машине)