Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Навороченный мониторинг FPS

Статус пользователя Metal Messiah
сообщение 27.11.2021, 18:11
Сообщение #1


Иконка группы

Стаж: 11 лет

Сообщений: 2399
Благодарностей: 1462
Полезность: 755

HostGame.cf
Плагин мониторинга FPS, которым я пользуюсь больше года.
Каждые 20 секунд замеряется пинг игроков и FPS. Каждые 120 секунд средние по пингу и FPS и моментальное значение FPS пишутся в файл.
Кто хочет изменить таймауты - меняйте параметр set_task().

Принцип в общем то тот же, что в Full FPS monitor by Karaulov из соседней темы.

Код плагина
Код
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
new g_logfile    [64]
new sumping[33], nchecks[33];
new fps, sfps, sfpsn, nowfps;
new Float:gametime;
new Float:framesper;
new pcvar_tic, pcvar_max;

public plugin_init()
{
    register_plugin("Ping FPS Logger","1.0","Metal Messiah");
    get_time("pinglog_%Y%m.log", g_logfile, charsmax ( g_logfile ) );
    pcvar_tic = register_cvar("sys_ticrate", "1100");
    pcvar_max = register_cvar("fps_max", "1000");
    sfps=0;
    sfpsn=0;
    register_forward(FM_StartFrame, "start_frame")
    set_task(20.0, "checkPing", 999888, _, _, "b");
    set_task(120.0, "logPing", 999889, _, _, "b");
}

public client_putinserver(plrid)
{
    sumping[plrid] = 0;
    nchecks[plrid] = 0;
    return PLUGIN_CONTINUE;
}

public client_disconnect(plrid)
{
    sumping[plrid] = 0;
    nchecks[plrid] = 0;
    return PLUGIN_CONTINUE;
}

public logPing()
{
    new maxping=0;
    new minping=999;
    new meanping=0;
    new num=0;
    new ping;
    for (new i=0; i<32; i++)
    if (nchecks[i] > 3)
    {
        num++;
        ping=sumping[i]/nchecks[i];
        meanping+=ping;
        if (ping>maxping) maxping=ping;
        if (ping<minping) minping=ping;
    }
    if (num>0)
    {
        meanping=meanping/num;
        new stdv=0;
        for (new i=0; i<32; i++)
        if (nchecks[i] > 3)
        {
            ping=sumping[i]/nchecks[i];
            ping=(ping-meanping)*(ping-meanping);
            stdv+=ping;
            sumping[i]=0;
            nchecks[i]=0;
        }
        stdv=sqroot(stdv/num);
        new meanfps=0;
        if (sfpsn>0) meanfps=sfps/sfpsn;
        sfps=0;
        sfpsn=0;
        new map[33];
        get_mapname(map,sizeof map - 1);        
        log_to_file(g_logfile, "%d    %d    %d    %d    %d    %d    %d    %s    %d    %d", num, minping, maxping, meanping, stdv, meanfps, nowfps, map, get_pcvar_num(pcvar_tic), get_pcvar_num(pcvar_max));
    }
    return PLUGIN_CONTINUE;
}

public checkPing()
{
    new ping, loss, iPlayers[32], pNum;
    get_players(iPlayers, pNum, "ch")
    if (pNum>0)
    {
        for(new p=0; p<pNum; ++p)
        {
            get_user_ping(iPlayers[p], ping, loss);
            sumping[iPlayers[p]]+=ping;
            nchecks[iPlayers[p]]++;
        }
    }
    return PLUGIN_CONTINUE;
}

public start_frame()
{
    gametime = get_gametime()
    if(framesper >= gametime)
    {
        fps++
    }
    else
    {
        framesper += 1.0;
        sfps+=fps;
        sfpsn++;
        nowfps=fps;
        fps = 1;
    }
}


В файл выводятся дата, количество игроков, значения пинга игроков (минимум, максимум, средний, стандартное отклонение, средний и текущий FPS, карта, значения sys_ticrate и fpx_max сервера. Изначально я искал зависимость FPS (или скорее глубины просадок FPS) от наличия пингеров или других факторов, ничего не нашел. FPS зависит от числа игроков и карты. Например, на de_aztec все плохо.

Todo: дату переделать в удобоваримый формат Д.М.Г чтобы файл можно было анализировать в том же офисе без предварительной обработки.


Полезные публикации - ссылки у меня в профиле. Ссылка на плагин против спама на сервере StopServerSpam там же.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: