Перед запуском приложения вызывается программа настройки, при помощи которой можно включить или выключить синхронизацию переключения страниц с обратным ходом луча по кадру (synchronization with vertical retrace). Здесь же пользователь может выбрать способ переключения страниц (buffer flipping mode). Он может использовать пересылку или настройку адреса.
Итак, с точки зрения буферизации растрового изображения, являющегося конечным результатом работы графической системы, разработчик должен выбирать между двойной буферизацией с вертикальной синхронизацией переключения страниц, двойной буферизацией без синхронизации с обратным ходом луча по кадру и тройной буферизацией кадров в видеопамяти.
Предварительный анализ не позволит принять решение, так как оптимальный выбор зависит от конкретной конфигурации аппаратных средств, потребности в видеопамяти для хранения текстур и характера сцены. Поэтому желательно иметь возможность такого выбора не только на этапе проектирования, но и при установке разработанной системы.
Стабилизация периода переключения страниц
Затраты времени на формирование изображения могут зависеть от положения камеры, ее ориентации и многих других факторов. Например, в случайные моменты времени Windows может потребовать время на подкачку страниц в оперативную память. Предположим, что частота кадровой синхронизации равна 100 Гц, а графическая система затрачивает на формирование кадра в среднем 8 мс, но в 5 % случаев возможны случайные задержки до 22 мс. Если в режиме двойной буферизации вызывать переключение страниц сразу же после формирования изображения, то большая часть кадров будет переключаться через 10 мс, но некоторые будут экспонироваться втрое дольше, поскольку подготовка очередного кадра потребует более двух периодов синхронизации. Это может привести к нарушению непрерывности движения отображаемых объектов.
Предварительные сведения
Возможны различные варианты решения проблемы. Так, разработчик может ограничить частоту переключения страниц, разрешая переключение только по каждому второму, третьему или четвертому импульсу кадровой синхронизации. В DirectX подобное поведение задается константами D3DPRESENT_INTERVAL_TW0 и D3DPRESENT_INTERVAL_THREE при инициализации графической системы. В нашем примере этот вариант решения требует переключать страницы по каждому третьему импульсу тактовой частоты. При отсутствии в библиотеке средств задания интервала переключения можно запускать функцию переключения мультимедиа таймером с периодом, превышающим частоту смены кадров. В рассматриваемом случае можно задать период 29 мс, при этом около миллисекунды библиотека будет ожидать прихода синхроимпульса.