Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

FPS на OpenGL

8.2K
15 января 2009 года
user1
71 / / 16.03.2007
Подскажите пожалуста - как получить численное значение FPS на OpenGL.

Или хотя-бы дайте ссылки на инфу, примеры кода, хоть что-то, что помогло-бы помочь получить правильное значение этого параметра.
:)
9
16 января 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: user1
Подскажите пожалуста - как получить численное значение FPS на OpenGL.

Или хотя-бы дайте ссылки на инфу, примеры кода, хоть что-то, что помогло-бы помочь получить правильное значение этого параметра.
:)


Структура для счетчика:

Код:
class fps_timer
{
private:
    float resolution;
    bool performance_timer;
    unsigned long mm_timer_start, mm_timer_elapsed;
    __int64 frequency, performance_timer_start, performance_timer_elapsed;

public:
    fps_timer()
    {
        ZeroMemory( this, sizeof( fps_timer ) );

        if (!QueryPerformanceFrequency( (LARGE_INTEGER *)&frequency ))
        {
            performance_timer = false;
            mm_timer_start = timeGetTime();
            resolution = 1.f / 1000.f;
            frequency = 1000;
            mm_timer_elapsed = mm_timer_start;
        }
        else
        {
            QueryPerformanceCounter( (LARGE_INTEGER *)&performance_timer_start );
            performance_timer = true;
            resolution = (float)(((double)1.0) / ((double)frequency));
            performance_timer_elapsed = performance_timer_start;
        }
    }

    ~fps_timer()
    {
    }

    float TimerGetTime()
    {
        __int64 time;

        if (performance_timer)
        {
            QueryPerformanceCounter((LARGE_INTEGER *) &time);
            return ((float)(time - performance_timer_start) * resolution) * 1000.f;
        }

        return ((float)(timeGetTime() - mm_timer_start) * resolution) * 1000.f;
    }
};


Применение:
Код:
...
fps_timer fps;

#define MAX_COUNT   15
int fcount = 0;
DWORD fr = 0, curfr = 0;

void update_scene()
{
...

    float f = fps.TimerGetTime();

... тут прорисовка сцены ...

    if(fcount < MAX_COUNT)
    {
    fr += (DWORD)((1000.f - ((fps.TimerGetTime() - f) * 10.f)) - 500.f);
    fcount++;
    }
    else
    {
    curfr = fr / MAX_COUNT;
    fr = fcount = 0;
    }

    // тут curfr показывает текущее значение FPS
...
}

Давно писал, не помню уже откуда идею брал...
8.2K
16 января 2009 года
user1
71 / / 16.03.2007
Большое так сказать человеческое вам спасибо за ответ. :)

Нет ну все таки хотелось-бы уточнить:

fr += (DWORD)((1000.f - ((fps.TimerGetTime() - f) * 10.f)) - 500.f);

что значит каждая из этих цифр ?

я так понял функция update_scene() вызывается при прорисовке
сцены(draw) и при простоях(idle) ?

Отображает совершенно неверные значения - от 200 до 500 числа ;(

Ну и функции
QueryPerformanceFrequency
QueryPerformanceCounter
я никогда не использовал, поэтому хотелось бы тоже уточнить что они делают.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог