Функция UpdateFPSSurface() вызывается при каждом обновлении экрана. Ее код показан в листинге10.13.
Листинг 10.13. Функция UpdateFPSSurface() | |
BOOL FullScreenWin::UpdateFPSSurface() { static const long interval = 100; static long framecount; framecount++;
if (framecount == interval) { static DWORD timenow; static DWORD timethen; timethen = timenow; timenow = timeGetTime(); double seconds = double(timenow - timethen) / (double)1000; int fps = (int)((double)framecount / seconds); static char buf[10]; int len = sprintf(buf, "FPS: %d", fps); HDC hdc; fpssurf->GetDC(&hdc); SelectObject(hdc, smallfont); SetTextColor(hdc, RGB(255,255,255)); SetBkColor(hdc, RGB(0,0,0)); SetBkMode(hdc, OPAQUE); ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &fpsrect, buf, len, 0); fpssurf->ReleaseDC(hdc); displayfps = TRUE; framecount = 0; } return TRUE; } |
Функция использует статическую переменную (framecount) для подсчета количества обновлений экрана, или кадров. Когда счетчик кадров достигнет 100 (это значение выбрано произвольно), будет вычислено и выведено на экран значение FPS для последних 100 кадров.
Для определения времени, прошедшего с предыдущего вычисления FPS используется быстродействующая мультимедийная функция timeGetTime(). Затем создается строка, содержащая вычисленное значение FPS, которая выводится на поверхность fpssurf. Сразу после обновления поверхности счетчик framecount обнуляется.