Трухильо Стэн
Шрифт:
• SelectObject
• SetBkMode
• SetBkColor
• SetTextColor
Мы воспользуемся этими функциями в программе Switch для вывода меню видеорежимов и значения FPS.
Вычисление FPS
FPS приложения можно вычислить несколькими способами. Наиболее точный из них — подсчитать общее количество кадров, выведенных приложением, и затем разделить его на время работы приложения в секундах. Недостаток этого способа заключается в том, что значение FPS можно получить лишь после того, как приложение завершится.
Чтобы вычислить FPS во время работы приложения, необходимо производить периодические измерения. К сожалению, скорость работы приложения может изменяться в зависимости от сложности графического вывода и объема внутренних вычислений. Кроме того, Windows замедляет работу приложения при передаче части процессорного времени другим приложениям или при переносе содержимого памяти на диск. В момент запуска приложение обычно работает медленнее, потому что Windows начинает сбрасывать данные на диск. Только после того, как Windows «успокоится» и перестанет работать с диском, можно будет получить достоверные значения FPS.
В программе Switch мы будем периодически вычислять FPS и отображать результат до истечения следующего интервала. Если запустить программу Switch, вы заметите, что значение FPS появляется не сразу; это происходит из-за того, что для получения достоверных показаний должно пройти некоторое время.
Для хронометража используется функция Win32 timeGetTime, которая возвращает количество миллисекунд, прошедших с момента запуска Windows. В программе Switch функция timeGetTime вызывается после каждых 100 кадров; значение FPS равно 100, разделенному на количество прошедших секунд.
Функция timeGetTime не обеспечивает максимальной точности измерений, которую можно получить в Windows (для более точного хронометража можно воспользоваться функцией QueryPerformanceCounter). Если бы мы отслеживали очень короткие периоды времени (например, интервалы по 10 миллисекунд), то функция timeGetTime не давала бы приемлемых результатов, но поскольку таймер используется не чаще одного раза в секунду, подходит и timeGetTime.
Давайте рассмотрим код программы Switch. Начнем с определения класса SwitchWin (см. листинг 4.2).
Листинг 4.2. Объявление класса SwitchWin
Класс SwitchWin содержит всего одну открытую (public) функцию — конструктор класса (вскоре мы его рассмотрим). В классе также присутствует функция OnKeyDown — обработчик сообщений, созданный ClassWizard (закомментированные директивы AFX, окружающие функцию OnKeyDown, используются ClassWizard для поиска функций-обработчиков). Мы воспользуемся этой функцией для обработки нажимаемых клавиш — стрелок, Enter и незаменимой клавиши Escape.
Следующие пять функций являются переопределенными версиями функций DirectDrawWin:
• SelectDriver
• SelectInitialDisplayMode
• CreateCustomSurfaces
• DrawScene
• RestoreSurfaces
С помощью функции SelectDriver приложение выбирает используемое видеоустройство (если их несколько). Она полностью совпадает со стандартной версией, создаваемой AppWizard, и выводит меню при наличии нескольких драйверов. Функция SelectInitialDisplayMode задает исходный видеорежим, устанавливаемый приложением. Здесь снова используется стандартная версия AppWizard, которая ищет видеорежим с параметрами 640x480x16.