Программирование графики с использованием Direct3D



         

Функция Render()


Теперь пришло время посмотреть, как в нашем приложении осуществляется вывод на экран. Функция Render() вызывается из функции RMApp::OnIdle() и отвечает за обновление поверхности вторичного буфера и выполнение переключения страниц. Код функции Render() приведен в листинге 10.14.

Листинг 10.14. Функция Render()

void FullScreenWin::Render() { if (primsurf->IsLost() == DDERR_SURFACELOST) { TRACE("Restoring primsurf...\n"); primsurf->Restore(); }

if (menusurf->IsLost() == DDERR_SURFACELOST) { TRACE("Restoring menusurf...\n"); menusurf->Restore(); UpdateMenuSurface(); }

if (fpssurf->IsLost() == DDERR_SURFACELOST) { TRACE("Restoring fpssurf...\n"); fpssurf->Restore(); }

DDBLTFX bltfx; memset(&bltfx, 0, sizeof(bltfx)); bltfx.dwSize = sizeof(bltfx); bltfx.dwFillColor = 0; backsurf->Blt(0, 0, 0, DDBLT_COLORFILL | DDBLT_WAIT, &bltfx);

scene->Move(D3DVALUE(1.0)); viewport->Clear(); viewport->Render(scene); device->Update();

UpdateFPSSurface(); if (displayfps) { DWORD w, h, d; GetCurDisplayModeDims(w, h, d); backsurf->BltFast(w - fpsrect.right, h - fpsrect.bottom, fpssurf, &fpsrect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT); }

backsurf->BltFast(0, 0, menusurf, &menurect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);

primsurf->Flip(0, DDFLIP_WAIT); }

В первой части функции производится проверка потери поверхностей. Потеря поверхностей может произойти, если память, используемая поверхностью, потребуется Windows для других целей. Теряется только память поверхности, а не сама поверхность. Обычно потеря поверхностей происходит, когда пользователь нажимает комбинацию клавиш ALT+TAB для переключения на другую программу.

Функция IsLost() интерфейса DirectDrawSurface возвращает TRUE если память поверхности была потеряна. Восстановить память поверхности очень просто — достаточно вызвать функцию Restore() интерфейса DirectDrawSurface. Это возвратит утраченную память поверхности, но не восстановит содержимое памяти.


Содержание  Назад  Вперед