Графика для Windows средствами DirectDraw


Графический вывод - часть 3


Функция 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 ); }

primsurf->Flip( 0, DDFLIP_WAIT );


Если флаг displayfps равен TRUE, поверхность FPS следует вывести на экран.


Начало  Назад  Вперед