[Урок] Таймеры и их количество

Richie56

Специалист
Пользователь
Регистрация
1 Май 2014
Сообщения
625
Реакции
195
как то уже проводил тесты, и всё-же рейт лучше именно на индивидуалках, какие бы ты логический цепочки не строил, всё-равно каким то образом это так

Все это можно протестировать и заметить уже на онлайне 200-300 когда есть существенная нагрузка на оборудование, ресурсы заняты и работают.
тестировал, глобалки просаживали больше, на примерно 20%
 
Последнее редактирование:

iTrue

• Зарегистрированный •
Регистрация
7 Авг 2018
Сообщения
20
Реакции
1
как то уже проводил тесты, и всё-же рейт лучше именно на индивидуалках, какие бы ты логический цепочки не строил, всё-равно каким то образом это так


тестировал, глобалки просаживали больше, на примерно 20%

Мне просто жалко сервер убивать, я бы показал что делают твои индивидуалки на онлайне 500.
Идеальный пример тому была Aurora.
Я пришел на проект 1 января, и увидел около 120 индивидуальных таймеров, а так же тикрейт 40-60 при онлайне 300 и это все при sleep 3.
А было дело на оборудование за 40к(React).
Наверняка многие с данного портала, заходили на аврору или играли на ней или слышали о лагах.
А знаешь что я сделал,


Убрал около 70-80 индивидуальных таймеров, точное количество уже и не скажу.
А результат стал 120-160 тикрейта, на оборудование за 15к при том же sleep.
Я не знаю что вы как тестируете там, но видимо вам придется верить вашим тестам, и убивать так же свой тикрейт сервера, веря тестам, наверняка проведенным на низком онлайне, или вовсе без него.
 

OKStyle

Адвокат по делам семейным
Регистрация
4 Мар 2011
Сообщения
3,817
Реакции
953
Странно, что я тут ещё не отписался.

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

Не слушать людей которые говорят таймеры нагрузки не несут а несет ее только код в таймере.
Использовать 1 глобальный таймер с циклов на MAX_PLAYERS или GetPlayerPoolSize, с хорошей и правильной структурой кода
И сам же ответил про свою "интересную" статью:
Все чаще и чаще я стал замечать среди кодеров на разных порталах довольно ложные советы.
Действительно.
 

Markken

Интересующийся
Пользователь
Регистрация
4 Янв 2019
Сообщения
14
Реакции
2
Сразу скажу, что не шарю в Pawn на достаточном уровне, чтобы что-то дельное ответить, но тем не менее. Суть твоей темы в том, что нужно использовать 1 (или как можно меньше) таймер, а не много, потому что в таком случае растет тикрейт сервера, а значит и лаги уменьшаются. Тогда по порядку, за счет чего растет Tickrate? За счет того, что каждый тик проверяется 1 таймер, а не, допустим, 50-200. Если судить с такой стороны, да, это хорошо, тикрейт высокий, но лишь потому, что это средний тикрейт.

Грубо говоря, тик с проверкой таймера занимает N времени, а тик, когда выполняется код таймера занимает 1000N времени (Все числа примера ради). В таком случае, ты конечно, получишь хороший тикрейт. Но теперь предположим, что у тебя каждый тик будет проверка на 50 таймеров, тогда один тик займет 50N времени, а код выполнения таймера 10N, к примеру. Да, тикрейт упадет, но в таком случае у тебя не будет жестких просадов перформанса у игроков. И даже, если так получится, что время выполнения индивидуальных таймеров > одного таймера, то все равно индивидуальные выигрывают засчет более равномерной нагрузки. Так и получается, что вариант с одним таймером (или их малым числом, опять же) проигрывает варианту с множеством таймеров. Плюс, когда у тебя несколько таймеров, далеко не факт, что все они односекундные и т.д. да и глупо проверять в одном таймере лишние вещи, для каждого функционала свой таймер, и лишь где позволяет реализация, можно таймеры объединить.

Знаешь, это как играть в игру. Что ты выберешь: играть в стабильные 30 fps или же в 60 fps, но с фризами?

Такое мое мнение, буду рад услышать поправки и критику. Не забывайте, что я написал в первом предложении.
 

red.inc

Участник форума
Пользователь
Регистрация
20 Июл 2019
Сообщения
130
Реакции
6
Я не хочу остаться в сторонке. Прочитал много информации и рассудив, дам ответ.
1. Индивидуальный таймер можно использовать, не будут все к примеру 1000 игроков сидеть в тс, максимум человек 600-700, это тоже нужно рассматривать со стороны, это не даёт нагрузку и лаги у игроков. Заметно это на том же Samp Rp. Ну и создавать 10 индивидуальных таймеров на каждого игрока, будет Хренова показываться, как и писал человек выше.

2. Общий таймер для сервера, с использованием итерации, будет затармаживать со скоростью воспроизведения. Пока он по каждому пройдется, задержка будет к примеру 1000-2000 мс, до нового воспроизведения.
 

Nexius_Tailer

• Профик •
Регистрация
19 Май 2013
Сообщения
1,582
Реакции
745
Общий таймер для сервера, с использованием итерации, будет затармаживать со скоростью воспроизведения. Пока он по каждому пройдется, задержка будет к примеру 1000-2000 мс, до нового воспроизведения.
Чтобы достичь такой задержки от единоразового выполнения таймера, нужно очень хорошо постараться с говнокодом. Другое дело, что даже при гораздо более маленьких задержках в общем таймере они с гораздо более высокой вероятностью будут заметны, особенно при более высоких нагрузках на сервер от каких-либо иных факторов.
 

Николай93

Участник форума
Пользователь
Регистрация
6 Июн 2011
Сообщения
356
Реакции
103
Уже десятки раз на разных форумах обсуждалась подобная тема и в конечном итоге на samp com все пришли к боле менее единому мнению.
Лучше 1000 таймеров с оптимизированным кодом на каждого игрока, чем один таймер с циклом на 1000 итераций.



Если скорость выполнения функции высокая, иначе создаёшь один большой микролаг. Индивидуальные таймеры же работают сами по себе, т.е. происходит рассеивание выполнение кода в промежутке времени, но пока выполняется поток амх машины.

Набросал проверочный код, выздоравливайте.
PHP:
new TestTimer[MAX_PLAYERS+1] = {-1, ...};
public OnPlayerConnect(playerid)
{
    if(TestTimer[playerid] != -1)
    {
        print("WTF? I KILL YOU MR. F*CKING TIMER!");
        KillTimer(TestTimer[playerid]);
        TestTimer[playerid] = -1;
    }
        
    TestTimer[playerid] = SetTimerEx("PlayerTestTimer", 500, true, "i", playerid);
    return true;
}

public OnPlayerDisconnect(playerid, reason)
{
    if(TestTimer[playerid] != -1)
    {
        print("WTF? F*CKING TIMERS!");
    }
    else
    {
        KillTimer(TestTimer[playerid]);
        TestTimer[playerid] = -1;
    }
    return true;
}

forward PlayerTestTimer(playerid);
public PlayerTestTimer(playerid)
{
    static new OldTickCount = 0;
    printf("PlayerTestTimer(%d) TimeElapsed: %d", playerid, (GetTickCount() - OldTickCount));
    OldTickCount = GetTickCount();
    return 1;
}

 

Пользователи онлайн

Реклама

Сверху