Восстановление поверхностей
Наше приложение благополучно инициализируется и выводит графические данные. Теперь необходимо справиться с возможной потерей поверхностей. При рассмотрении функции DirectDrawWin::PreDrawScene мы видели, что DirectDrawWin вызывает виртуальную функцию RestoreSurfaces(), чтобы производный класс получил возможность восстановить потерянные поверхности. Функция RestoreSurfaces() отвечает за восстановление как потерянной памяти поверхности, так и ее содержимого. Функция BounceWin::RestoreSurfaces() выглядит так:
void BounceWin::RestoreSurfaces() { if (surf1->IsLost()==FALSE) return; CString filename; if (GetCurDisplayDepth()==8) filename="tri08.bmp"; else filename="tri24.bmp";
surf1->Restore(); LoadSurface( surf1, filename ); } |
DirectDraw может отнимать у неактивного приложения только поверхности, находящиеся в видеопамяти, так что нет смысла в восстановлении поверхностей из системной памяти. Поэтому RestoreSurfaces() сначала проверяет, была ли потеряна единственная вспомогательная поверхность нашего приложения, и если нет — функция прекращает работу. Если же поверхность была потеряна, мы восстанавливаем ее память функцией Restore(), а содержимое — функцией LoadSurface().
Поверхность menusurf восстанавливается функцией Restore() с последующим вызовом функции UpdateMenuSurface(), в которой происходит стирание и перерисовка поверхности меню. При восстановлении fpssurf мы сначала вызываем Restore(), а потом стираем содержимое поверхности, потому что это содержимое после восстановления оказывается непредсказуемым. Не забывайте, поверхности чаще всего теряются из-за того, что занимаемая ими видеопамять понадобилась другому приложению.
Обратите внимание: мы не восстанавливаем значение, отображаемое на поверхности FPS. Потеря первичной поверхности и вторичного буфера означает, что последнее вычисленное значение FPS, по всей видимости, стало неверным. Наша программа было свернута или уступила фокус другому приложению; в любом случае нельзя с уверенностью сказать, насколько быстро обновляется изображение в данный момент. Вместо того чтобы выводить устаревшее значение FPS, мы очищаем поверхность и присваиваем переменной displayfps значение FALSE, тем самым запрещая вывод поверхности до получения новой величины FPS. Кроме того, мы обнуляем переменную framecount, чтобы перезапустить механизм вычисления FPS.
Вот и все, что касается программы Switch. Пора заняться частотой смены кадров и перейти к приложению SuperSwitch.