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



был бы проигнорирован, а пиксели с нулевыми значениями выводились бы черным цветом. Второй флаг показывает, что выход из функции BltFast() должен произойти лишь после завершения копирования.

Вернемся к функции 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);