3.9. Интерактивные программы анимации Теперь вернемся к нашему вращающемуся квадрату. В рассмотренную ранее программу нужно внести два изменения. Во-первых, в функции main() нужно заказать режим двойной буферизации:
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
Во-вторых, нужно скорректировать функцию display (), добавив в самый ее конец оператор glutSwapBuffers(); Учтите, что двойная буферизация не решает проблемы скорости формирования изображения. Фактически эта технология позволяет только избежать наложения отображения и формирования новой фазы картинки - новое изображение выводится на экран только после завершения его формирования. Но возможно получить вполне приемлемое качество динамического изображения при частоте формирования новых фаз порядка 10-20 Гц.
3.9.3. Проблемы с буферизацией При создании интерактивных графических программ формирования динамического изображения программисту приходится сталкиваться с целым рядом проблем, которые не могут быть решены только за счет двойной буферизации. Возвращаясь к рассмотренному выше примеру - программе рисования по командам пользователя, - предположим, что нам понадобилось добавить в картинку изображение часов, которые показывали бы текущее время выполнения программы (рис. 3.22).
В большинстве операционных систем существуют функции, возвращающие текущее астрономическое время в виде строки символов в коде ASCII, либо функции, возвращающие целое число, равное времени, прошедшему после некоторого события (в секундах). Периодически вызывая эти функции (например, в программе обработки простоя), можно затем преобразовать полученное значение в приемлемый формат, например часы .минуты:секунды. Последняя стадия процесса - вывести эти меняющиеся данные на экран в виде текста.
Посмотрим, что случится, если добавить соответствующий фрагмент в первый вариант программы построения вращающегося квадрата, в котором не использовалась двойная буферизация. Вы, скорее всего, сразу же заметите, что показания часов мигают при выполнении очистки экрана функцией display!). Попробуем справиться с этой проблемой, воспользовавшись технологией двойной буферизации. При переходе в режим двойной буферизации мигание исчезнет, но вместо этой проблемы появится другая, еще более серьезная, - станут мерцать основные объекты на рабочем поле окна. Причина этого неприятного эффекта заключается в том, что используется режим немедленного вывода изображения. Объекты, которые формируются программой по командам пользователя, передаются в буфер кадра единственный раз. Поэтому каждый объект оказывается только в одном из двух буферов и не может присутствовать одновременно в двух. Теперь, справившись с миганием показаний часов, мы видим, что начали мерцать объекты в графической зоне экрана.