Как предовратить повторный запуск таймера?
#1

Суть вопроса в том, что я хочу оптимизировать спидометр. Делаю запуск таймера для обновления спидометра когда игрок садится в транспорт, останавливаю его когда выходит.
Сделал это так:
в newstate == PLAYER_STATE_DRIVER поставил старт, а oldstate == PLAYER_STATE_DRIVER остановку (удаление)
Также дополнительно останавливаю таймер при выходе из игры.

Но проблема в том, что иногда таймер запускается несколько раз и id нового таймера хранится в переменной, а старого нет, но он все еще работает. Понятно что таймер обновляет текстдравы скорости, бензина и т.д., а когда их несколько то бензин снимается быстрее в столько раз, сколько и запущено лишних таймеров (обычно не более 2х). Удалить "гуляющий" таймер который уже выпал из переменной нельзя, задаюсь вопросом как сделать чтобы он не мог запустится несколько раз?

P.S. Если есть другое решение проблемы, буду очень рад его выслушать
Reply
#2

Делать таймер без повтора и запускать каждую итерацию с проверкой на положение (вне авто или в нём).
Reply
#3

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
Делать таймер без повтора и запускать каждую итерацию с проверкой на положение (вне авто или в нём).
Тоесть это нужно запускать таймер без повтора, в этом же таймере, в конце, сделать проверку на положение и если оно равно PLAYER_STATE_DRIVER то опять запускать таймер?
Не будет ли такой "цикл запусков" слишком нагружать сервер?
Reply
#4

Гораздо меньше, чем повторяющийся таймер. Коллизий точно не будет.
Reply
#5

А я бы вообще без таймеров делал. ИМХО 2 условия в OnPlayerUpdate отлично подойдут. И не говорите мне, что бла бла нельзя в OnPlayerUpdate. Предположим, что у нас таймер игрока 40 мсек, обновлять спидометр надо раз в 100 мсек, можно спокойно раз в 2-3 OnPlayerUpdate обновлять спидометр.
Reply
#6

Quote:
Originally Posted by jhonyxakep
Посмотреть сообщение
А я бы вообще без таймеров делал. ИМХО 2 условия в OnPlayerUpdate отлично подойдут. И не говорите мне, что бла бла нельзя в OnPlayerUpdate. Предположим, что у нас таймер игрока 40 мсек, обновлять спидометр надо раз в 100 мсек, можно спокойно раз в 2-3 OnPlayerUpdate обновлять спидометр.
И не говорите мне, что бла бла нельзя в OnPlayerUpdate... - а я скажу всетаки что нельзя. У меня таймер каждые 300 мсек выполняется, на сек грубо говоря 3 раза. OnPlayerUpdate выполняется около 7-9 раз на секунду если я не ошибаюсь и все это время надо обновлять тексдравы? А если еще учитывать то что у меня там проверка на скорость для античита и т.д. то вряд ли что-то хорошее получится.
Reply
#7

Всё в OnPlayerUpdate можно, в меру конечно. А против говорят в основном те кто даже не тестировал код при онлайне
Reply
#8

Я возражу. У меня спидометр в OnPlayerUpdate - но: после использования спидометра (обновления тексдрава), ставится таймер, блокирующий спидометр на 500 мс. Т.е., спидометр выполняется 2 раза в секунду. Но всё равно таймер то используется.. плюс, OnPlayerUpdate очень динамичный - он может выполнятся 2 раза в секунду, а может и 20 - например, когда игрок целится.
Reply
#9

Главное отрегулировать частоту вызова onplayerupdate - стандартных конфигов вполне досточно.
Reply
#10

Quote:

И не говорите мне, что бла бла нельзя в OnPlayerUpdate... - а я скажу всетаки что нельзя. У меня таймер каждые 300 мсек выполняется, на сек грубо говоря 3 раза. OnPlayerUpdate выполняется около 7-9 раз на секунду если я не ошибаюсь и все это время надо обновлять тексдравы? А если еще учитывать то что у меня там проверка на скорость для античита и т.д. то вряд ли что-то хорошее получится.

Сделайте переключатель. Я об этом в своем посте и говорил. Условие+переменная+код изменения значения переменной позволит избавится от таймера, и запихать все в OnPlayerUpdate
Reply
#11

Quote:
Originally Posted by jhonyxakep
Посмотреть сообщение
Сделайте переключатель. Я об этом в своем посте и говорил. Условие+переменная+код изменения значения переменной позволит избавится от таймера, и запихать все в OnPlayerUpdate
Но он не всегда выполняется одинаковое количество раз. К примеру, я двигаюсь, действие выполняется 20 раз в секунду, делаю обновление спидометра на каждый 7. Если отстановится выполнится примерно 2-3 раза в сек. Тоесть если я буду ехать, потом остановлюсь у меня скорость обновится через несколько секунд. Теперь если о самих функциях спидометра говорить, он будет жрать разное количество бензина.
Reply
#12

Quote:

Но он не всегда выполняется одинаковое количество раз. К примеру, я двигаюсь, действие выполняется 20 раз в секунду, делаю обновление спидометра на каждый 7. Если отстановится выполнится примерно 2-3 раза в сек. Тоесть если я буду ехать, потом остановлюсь у меня скорость обновится через несколько секунд.

Неужели я был не прав? По моему OnPlayerUpdate выполняется регулярно.
Reply
#13

Нет, интенсивность обновления инфы об игроке зависит от его поведения. У стоящего игрок - 1 раз в секунду апдейт, у бегущего - чаще, у дерущегося - ещё чаще.
Reply
#14

Quote:

Нет, интенсивность обновления инфы об игроке зависит от его поведения. У стоящего игрок - 1 раз в секунду апдейт, у бегущего - чаще, у дерущегося - ещё чаще.

Как можно спровоцировать вызов этого коллбека на клиенте? Просто у меня на сервере он действительно регулярно запускается
Reply
#15

В OnPlayerUpdate поставь вывод текста в чат с GetTickCount и смотри интервал.
Reply
#16

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
Нет, интенсивность обновления инфы об игроке зависит от его поведения. У стоящего игрок - 1 раз в секунду апдейт, у бегущего - чаще, у дерущегося - ещё чаще.
У стоящего игрока на ногах апдейт 2 раза в секунду.
Но мы говорим щас о транспорте, а там даже если игрок стоит на месте действие всеравно выполняется более 10 раз на секунду.

P.S. Я тоже кстати в сообщении выше ошибся, думал когда стоишь оно выполняется только несколько раз на секунду (в машине)
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)