Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Замена SetTimer на gettime

Статус
В этой теме нельзя размещать новые ответы.

XemyL

Изучающий
Пользователь
Регистрация
5 Мар 2012
Сообщения
719
Лучшие ответы
0
Репутация
572
Представляю вам новый способ использования таймеров, взамен SetTimer. Приведу + и - работы с ним.

gettime:
+ Нагружает сервер меньше чем SetTimer
+ На данный момент самый точный способ использования таймеров
- Может работать только с таймерами где число секунд - целое число. 30 секунд, 21 секунда, 1 минута, 2 часа и т.п. (1.5 секунды, 0.4 и т.д. не будут работать)

Чтобы таймеры на этой функции работали, нужно создать всего лишь один таймер на 250 мс. Он не будет нагружать сервер, можете не волноваться. Вот пример создания:


forward UpdateTimers(); // Ко всем forward

В public OnGameModeInit:
SetTimer("UpdateTimers", 250, 1);

Если увеличить 250, то можно ещё больше снизить нагрузку, взамен точности. Решать вам, что важнее.

В конце мода создаём:
PHP:
public UpdateTimers()
{
    return 1;
}
Давайте попробуем создать 2 типа таймеров. Глобальный и для определённого игрока.

Глобальный таймер:

new Timer[3]; // Ко всем new

В public OnGameModeInit:
PHP:
Timer[0] = gettime()+30; // Запустили таймер на 30 секунд
Timer[1] = gettime()+60; // Запустили таймер на 1 минуту
Timer[2] = gettime()+90; // Запустили таймер на 1 минуту 30 секунд
В public UpdateTimers
PHP:
    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:
PHP:
SetPVarInt(playerid, "Timer1", gettime()+30); // Запустили таймер на 30 секунд
SetPVarInt(playerid, "Timer2", gettime()+60); // Запустили таймер на 60 секунд
В public UpdateTimers
PHP:
    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 мс

Мой способ:
1 выполнение - отклонение 163 мс
2 выполнение - отклонение 188 мс
3 выполнение - отклонение 5 мс

 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу