> > > > >

Поиск fps detector

Сообщения
29
Рейтинг
76
#21
Кстати, сам клиент кс считает фпс вот так:

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);
  }
}
 
Последнее редактирование:
1  
Сообщения
309
Рейтинг
520
#22
Garey способ подсчета фпс через PlayerPreThink очень не точный. Так как, точность больше зависит от фпс сервера, нежели клиента.
Вообще нет точного способа, определить фпс клиента, на стороне сервера. Но более корректно было бы сделать расчет через cmd.msec,
Назвать способ с погрешностью в 1-10% очень неточным и предложить магический msec, где на 500фпс погрешность до 100%.
 
 
Сообщения
29
Рейтинг
76
#23
способ с погрешностью в 1-10%
Откуда такие цифры 1-10% ? Погрешность может быть совершенна любая. Все зависит от сервера (в больше степени) и клиента. Суть в том, что бы меньше зависть от сервера. Да, способ не идеальный, но как уже было сказано, идеального способа нет.
 
 
Сообщения
309
Рейтинг
520
#24
из моей практики спидиран сервера, моих античитов. не сможет prethink сильно наврать, он выдает то, что отдал клиент, да из-за потерь задержек может обработать за раз больше пакетов и получить в секунду больший фпс, чем реальный, но погрешность не такая большая.
а msec это целое число где 1 при 500+ фпс, 2 при 333-500 фпс, 3 при 250-333 и т.д. какая тут точность? целое одно значение на диапазон.
 
1  
Сообщения
170
Рейтинг
383
#25
На самом деле 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.
 
Последнее редактирование:
4  

Похожие темы

Ответы
24
Просмотры
2.625
Ответы
27
Просмотры
3.515
Ответы
24
Просмотры
2.505
> > > > >