Программирование игр для Windows. Советы профессионала


Использование сигнала вертикальной синхронизации - часть 2


Итак, мы можем написать подпрограмму, которая будет запрашивать статус бита и отслеживать начало процесса обратного вертикального хода луча. После этого она вернет управление основной программе, которая будет знать, что следующую 1/70-ю долю секунды для VGA (и 1/60-ю секунды для EGA), можно совершенно спокойно писать в видеобуфер.

Я написал демонстрационную программу VSYNC.С, которая выполняет подобную синхронизацию и вычисляет количество периодов обратного вертикального хода луча как функцию от времени. Так как за секунду выполняется 70 циклов регенерации экрана, то после минутной работы программы результат должен оказаться равным 4200. Листинг 7.5. содержит исходный текст этой программы.

Листинг 7.5. Подсчет количества циклов обратного вертикального хода луча (VSYNC.С).

// ВКЛЮЧАЕМЫЕ ФАЙЛЫ ////////////////////////////////////////////

#include <dos.h>

#include <bios.h>

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <graph.h>

// ОПРЕДЕЛЕНИЯ ////////////////////////

#define VGA_INPUT_STATUS_1   0x3DA // регистр

состояния

VGA,

// бит 3 - сигнал вертикальной синхронизации

// 1 - происходит обратный вертикальный ход луча

// 0 - нет обратного вертикального хода луча    

#define VGA_VSYNC_MASK 0х08

// маскировка неиспользуемых битов регистра

// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ////////////////////

unsigned char far *video_buffer

= (char far

*)0xA0000000L;// указатель на видеопамять

// ФУНКЦИИ /////////////////////////////////////////////////

void Wait_For_Vsync(void)

{

// эта функция ожидает начала обратного вертикального хода луча, а

// если луч уже совершает обратный ход - ожидает следующего цикла

while (_inp(VGA_INPUT_STATUS_1) & VGA_VSYNC_MASK)

{

// обратный вертикальный ход луча - ничего не делаем

} // конец оператора while

// ожидаем прихода сигнала vsync и возвращаем

// управление вызвавшей функции

while (! (_inp(VGA_INPUT_STATUS_l) & VGA_VSYNC_MASK) )

{

// ожидание начала обратного вертикального




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