В этом уроке мы научимся вычислять FPS и выведем их на экран.
Код для урока взят из предыдущего, «шрифты FTGL».
Все файлы, кроме main.cpp остаются без изменений.
Изменяем main.cpp:
#pragma comment(lib, «winmm.lib»)// Далее, после обьявления шрифта обьявим глобальную переменную
// для хранения FPS:
float FPS;// Теперь напишем функцию, вычисляющую FPS каждый кадр:
///////////////////////////////// CALCULATE FRAMES PER SECOND \\\\*
/////
///// Эта функция рассчитывает FPS и выводит их
/////
///////////////////////////////// CALCULATE FRAMES PER SECOND \\\\*
void CalculateFrameRate()
{
//Ниже мы создадим несколько статичных переменных, т.к. хотим, чтобы они сохраняли своё
//значение после завершения работы ф-ии. Мы могли бы сделать их глобальными, но это будет
//излишним.
static float framesPerSecond = 0.0f; //наши фпс
static float lastTime = 0.0f; //Тут хранится время, прошедшее с последнего кадра
static char strFrameRate[50] = {0}; //Строка для вывода
//Тут мы получаем текущий tick count и умножаем его на 0.001 для конвертации из миллисекунд в секунды.
float currentTime = timeGetTime() * 0.001f;
//Увеличиваем счетчик кадров
++framesPerSecond;
//Теперь вычтем из текущего времени последнее запомненное время. Если результат больше единицы,
//это значит, что секунда прошла и нужно вывести новый FPS.
if(currentTime — lastTime > 1.0f)
{
//Устанавливаем lastTime в текущее время. Теперь оно будет использоватся как предидущее время
//для след. секунды.
lastTime = currentTime;
// Установим FPS для вывода:
FPS=framesPerSecond;
//Сбросим FPS
framesPerSecond = 0;
}
}
// Теперь изменим функцию RenderScene(). Добавим вызов CalculateFrameRate() и
// Участок кода, в котором в прошлом уроке выводилось
// слово «Тест» заменим на следующий:
//*************************************************************************
CalculateFrameRate();
glDisable(GL_DEPTH_TEST);
glColor3f(1.0f,1.0f,1.0f);
// Сформируем строку для вывода:
wchar_t buf[256];
swprintf(buf, sizeof(buf), L«Текущие FPS: %f», FPS);
Font->Print(10,20, buf); // Выводим текст
glEnable(GL_DEPTH_TEST);
//*************************************************************************
Просто, не так ли? Теперь после компиляции в левом верхнем углу
рендерится надпись «Текущие FPS: x»
Красота %)