Графика для Windows средствами DirectDraw | страница 80
Вернемся к функции DrawScene(). Наша следующая задача - обновление и отображение поверхности FPS (fpssurf). Однако, как было сказано выше, поверхность fpssurf обновляется лишь после того, как закончится очередной интервал хронометража.
Вычисление FPS и подготовка поверхности осуществляются функцией UpdateFPSSurface(), вызываемой функцией DrawScene() при каждом обновлении экрана. Функция UpdateFPSSurface() выглядит так:
>BOOL SwitchWin::UpdateFPSSurface() {
> static const long interval=100;
> 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, "%d FPS", fps);
> ClearSurface(fpssurf, 0);
> HDC hdc;
> fpssurf->GetDC(&hdc);
> SelectObject(hdc, smallfont);
> SetBkMode(hdc, TRANSPARENT);
> SetBkColor(hdc, RGB(0,0,0));
> SetTextColor(hdc, textshadow);
> TextOut(hdc, 1, 1, buf, len);
> SetTextColor(hdc, brighttextcolor);
> TextOut(hdc, 0, 0, buf, len);
> fpssurf->ReleaseDC(hdc);
> displayfps=TRUE;
> framecount=0;
> }
> return TRUE;
>}
Функция UpdateFPSSurface() использует переменную framecount для подсчета выведенных кадров. Переменная framecount обнуляется в двух случаях: при изменении видеорежима и при обновлении поверхности fpssurf заново вычисленным значением FPS.
Каждый раз, когда заданное количество кадров будет подготовлено и выведено на экран, функция timeGetTime() подсчитывает количество прошедших миллисекунд. По этой величине определяется текущий FPS приложения.
Значение FPS преобразуется в строку и выводится на поверхность FPS (после предварительной очистки поверхности функцией ClearSurface()). После вывода текста переменная framecount обнуляется, и начинается новый интервал хронометража. Наконец, переменной displayfps присваивается значение TRUE; оно говорит о том, что на поверхности FPS находится допустимое значение, которое следует вывести на экран.
Возвращаясь к функции DrawScene() (см. листинг 4.4), мы видим, что код отображения fpssurf и переключения страниц выглядит так:
>if (displayfps) {
> int x=displayrect.right-fpsrect.right-1;
> int y=displayrect.bottom-fpsrect.bottom-1;
> backsurf->BltFast(x, y, fpssurf, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);