Мониторинг FPS и задержки между кадрами

karaulov

Скриптер
Постоялец
Пользователь
Регистрация
5 Май 2019
Сообщения
1.041
Симпатии
358
Пол
Мужской
Плагин невероятно простой, и отображает полезную информацию о FPS и задержкой между кадрами. Да задержка между кадрами КРАЙНЕ ВАЖНА!


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

Важно понимать что сам плагин выполняет действия(хотя и не значительные) каждый кадр по этому он сам будет вызывать падение фпс, судя по наблюдениям максимум на 5%.
По этому устанавливать его следует только для поиска проблем в плагинах и модулях.

C++:
#include <amxmodx>
#include <engine>
 
new Float:max_delay = 0.0;
new Float:old_max_delay = 0.0;
 
new max_fps = 0;
new old_max_fps = 0;
 
new min_fps = 0;
new old_min_fps = 0;
 
new current_fps = 0;
 
new last_check_time = 0;
new Float:last_delay_check_time = 0.0;
 
public plugin_init()
{
    register_plugin("Full FPS monitor", "0.1", "Karaulov");
    register_clcmd("say /serverfps", "serverfps")
    set_task(30.0,"max_delay_clean",1,_,_,"b")
}
 
public max_delay_clean(id)
{
    log_amx("FPS MONITOR: Max delay: %d ms. Max fps: %d. Min fps: %d",floatround(max_delay * 1000.0),max_fps,min_fps);
    
    old_max_delay = max_delay;
    max_delay = 0.0;
    old_min_fps = min_fps;
    min_fps = 0;
    old_max_fps = max_fps;
    max_fps = 0;
}
 
public serverfps(id)
{
    client_print_color(id,print_team_red,"Max delay: %d ms and %d ms. Max fps: %d and %d. Min fps: %d and %d",floatround(max_delay * 1000.0),
                        floatround(old_max_delay * 1000.0),max_fps,old_max_fps,min_fps,old_min_fps);
}
 
new tmpSysTime = 0;
new Float:tmpGameTime = 0.0;
 
public server_frame()
{
    tmpSysTime = get_systime();
    tmpGameTime = get_gametime();
    if (last_check_time == 0)
    {
        last_check_time = tmpSysTime;
    }
    else
    {
        if (last_delay_check_time == 0.0)
        {
            last_delay_check_time = tmpGameTime;
        }
        else
        {
            if (tmpGameTime - last_delay_check_time > max_delay)
            {
                max_delay = tmpGameTime - last_delay_check_time;
            }
            last_delay_check_time = tmpGameTime;
        }
        if (tmpSysTime - last_check_time >= 1)
        {
            old_min_fps = min_fps;
            old_max_fps = max_fps;
            
            if (current_fps > max_fps || max_fps == 0)
            {
                max_fps = current_fps;
            }
            else if (current_fps < min_fps || min_fps == 0)
            {
                min_fps = current_fps;
            }
            
            current_fps = 0;
            last_check_time = tmpSysTime;
        }
        else
        {
            current_fps++;
        }
    }
}
Плагин пишет каждые 30 секунд максимальную задержку между кадрами и минимальный/максимальный фпс за последние 30 секунд в текущий файл из amxmodx/logs .
Или же по клиентской команде say /serverfps


Повторяю использовать исключительно для отладки и поиска проблем, не рекомендую устанавливать плагин для постоянной работы!
(хотя и не несет большой нагрузки, но за последствия постоянной работы я не ручаюсь)
 
Сверху Снизу