Поиск fps detector

Сообщения
162
Реакции
445
Помог
2 раз(а)
Кстати, сам клиент кс считает фпс вот так:

C++:
void SCR_DrawFPS()
{
  int fps;
  static double rolling_fps;
  
  if ( cl_showfps.value != 0.0 && host_frametime > 0.0 )
  {
    rolling_fps = 0.6 * rolling_fps + host_frametime * 0.4;
    fps = floor(1.0 / rolling_fps);
    NET_DrawString(2, 2, 0, 1.0, 1.0, 1.0, "%d fps", fps);
  }
}
 
Последнее редактирование:
Сообщения
576
Реакции
1,003
Помог
18 раз(а)
Garey способ подсчета фпс через PlayerPreThink очень не точный. Так как, точность больше зависит от фпс сервера, нежели клиента.
Вообще нет точного способа, определить фпс клиента, на стороне сервера. Но более корректно было бы сделать расчет через cmd.msec,
Назвать способ с погрешностью в 1-10% очень неточным и предложить магический msec, где на 500фпс погрешность до 100%.
 
Сообщения
162
Реакции
445
Помог
2 раз(а)
способ с погрешностью в 1-10%
Откуда такие цифры 1-10% ? Погрешность может быть совершенна любая. Все зависит от сервера (в больше степени) и клиента. Суть в том, что бы меньше зависть от сервера. Да, способ не идеальный, но как уже было сказано, идеального способа нет.
 
Сообщения
576
Реакции
1,003
Помог
18 раз(а)
Откуда такие цифры 1-10%
из моей практики спидиран сервера, моих античитов. не сможет prethink сильно наврать, он выдает то, что отдал клиент, да из-за потерь задержек может обработать за раз больше пакетов и получить в секунду больший фпс, чем реальный, но погрешность не такая большая.
а msec это целое число где 1 при 500+ фпс, 2 при 333-500 фпс, 3 при 250-333 и т.д. какая тут точность? целое одно значение на диапазон.
 

Garey

ninjaCow
Сообщения
411
Реакции
1,051
Помог
10 раз(а)
На самом деле the_hunter и Mistrick оба правы, prethink как и cmdstart вызывается столько раз сколько фпс у игрока.

Но msec - это сколько миллисекунд длилась команда, например при фпс 99.5 (не при кваре а именно при таком фпс) msec будет равно 10 но иногда будет проскальзывать 11 (примерно 5 раз), засчет этого как раз и эффект который описал мистрик если сравнивать значение msec единожды.
Но можно высчитать фпс до десятых таким способом:

accurate_fps = (сумма_количества_команд*количество_миллисекунд)/сумма_длительности_команд
количество_миллисекунд - промежуток в котором идет прибавление суммы числа и длительности команд, для кадров в секунду очевидно используется значение 1000 мс т.е. 1 секунда
пример кода:
C++:
#include < amxmodx >
#include < fakemeta >

public plugin_init()
{
    register_plugin("Fps Checker", "0.2", "Dev-CS.ru")
    register_forward(FM_CmdStart, "CmdStart");
}

enum fps_s {
    warnings,
    num_cmds,
    msec_sum,
    Float: next_check,
    Float: fps
} new fps_info[33][fps_s]


public client_connect(id) {
    arrayset(fps_info[id], 0, sizeof(fps_info[]));
}

public CmdStart(id, uc_handle)
{ 
    if (fps_info[id][next_check] <= get_gametime())
    {         
        fps_info[id][fps] = (fps_info[id][num_cmds] * 1000.0) / fps_info[id][msec_sum];
        if (fps_info[id][fps] > 101.0)
        {
            if (++fps_info[id][warnings] > 3)
            {
                kick_user(id, "100+ fps")
            }                     
        }
        fps_info[id][num_cmds] = 0;
        fps_info[id][msec_sum] = 0;
        fps_info[id][next_check] = get_gametime() + 1.0;
    }
    fps_info[id][num_cmds]++;
    fps_info[id][msec_sum] += get_uc(uc_handle, UC_Msec); 
}

stock kick_user(id, szReason[])
{
    new iUserId = get_user_userid(id);
    server_cmd("kick #%d ^" % s ^"", iUserId, szReason);
}
В реальности же такая точность ненужна, только возможно если вы делаете LongJump Stats.
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу