shape1
shape2
shape3
shape4
shape7
shape8

Замена SetTimer & SetTimerEx на gettime

Mirex

Руководитель проекта
Команда портала
Гл.Администратор
Золотой
21.12.2013
2 512
3
550
0
29
framehost.ru
Скриптер
Представляю вам новый способ использования таймеров, взамен SetTimer. Приведу + и - работы с ним.
 
gettime:
+ Нагружает сервер меньше чем SetTimer
+ На данный момент самый точный способ использования таймеров
- Может работать только с таймерами где число секунд - целое число. 30 секунд, 21 секунда, 1 минута, 2 часа и т.п. (1.5 секунды, 0.4 и т.д. не будут работать)
 
Чтобы таймеры на этой функции работали, нужно создать всего лишь один таймер на 250 мс. Он не будет нагружать сервер, можете не волноваться. Вот пример создания:
 
В public OnGameModeInit
SetTimer("UpdateTimers", 250, 1);
Если увеличить 250, то можно ещё больше снизить нагрузку, взамен точности. Решать вам, что важнее.

В конец мода:

forward UpdateTimers();
public UpdateTimers()
{
return 1;
}

Давайте попробуем создать 2 типа таймеров. Глобальный и для определённого игрока.
 
Глобальный таймер:
 
Ко всем глобальным переменным:
Код:
new Timer[3];
В public OnGameModeInit
Timer[0] = gettime()+30; // Запустили таймер на 30 секунд
Timer[1] = gettime()+60; // Запустили таймер на 1 минуту
Timer[2] = gettime()+90; // Запустили таймер на 1 минуту 30 секунд

В public UpdateTimers

new GetTime = gettime();
if(Timer[0] <= GetTime && Timer[0] != 0)
{
Timer[0] = GetTime+30; // Снова запустили таймер. Он будет повторяющийся
Timer1Start(); // Тут выполняем действие
}
if(Timer[1] <= GetTime && Timer[1] != 0)
{
Timer[1] = 0; // Завершаем работу таймера
Timer2Start(); // Выполняем действие
}
if(Timer[2] <= GetTime && Timer[2] != 0)
{
Timer[2] = 0; // Завершаем работу таймера
Timer3Start(); // Выполняем действие
}

Таймер для игрока:

В public OnPlayerConnect

SetPVarInt(playerid, "Timer1", gettime()+30); // Запустили таймер на 30 секунд
SetPVarInt(playerid, "Timer2", gettime()+60); // Запустили таймер на 60 секунд

В public UpdateTimers

Код:
for(new A, B = GetMaxPlayers(); A != B; A++)
{
    new GetTime = gettime();
    if(GetPVarInt(A, "Timer1") <= GetTime && GetPVarInt(A, "Timer1") != 0)
    {
        SetPVarInt(A, "Timer1", GetTime+30); // Снова запустили таймер. Он будет повторяющийся
        Timer1Start(A); // Тут выполняем действие
    }
    if(GetPVarInt(A, "Timer2") <= GetTime && GetPVarInt(A, "Timer2") != 0)
    {
        SetPVarInt(A, "Timer2", 0); // Завершаем работу таймера
        Timer1Start(A); // Тут выполняем действие
    }
}
Ниже приведены тесты точности различных способов реализации таймеров. Тесты проводились на повторяющемся минутном таймере.
 
Стандартный способ:
1 выполнение - отклонение 4746 мс
2 выполнение - отклонение 4787 мс
3 выполнение - отклонение 4920 мс
 
Способ на gettime:
1 выполнение - отклонение 163 мс
2 выполнение - отклонение 188 мс
3 выполнение - отклонение 5 мс
 
Автор: Неизвестен.
 

Maxim

Освоившийся
Пользователь
24.01.2014
60
29
0
28
Надежный вариант? Кто нибудь пробовал?