Эту проблему можно решить с помощью двойной буферизации (double buffering). Предположим, что в нашем распоряжении есть два буфера кадра, которые принято называть рабочим (front buffer) и фоновым (back buffer). Рабочий буфер - это тот, из которого выполняется регенерация изображения на экране, а в фоновом изображение формируется программой. По командам от прикладной программы можно переключать функции буферов: сделать рабочим тот, который ранее был фоновым, а фоновым - тот, который ранее был рабочим. При переключении вызывается функция display (), в результате чего на экран начинает автоматически выводиться изображение, подготовленное ранее в фоновом буфере, а новое изображение можно формировать в том буфере, который теперь стал фоновым. Механизм двойной буферизации устанавливается в режиме инициализации аргументом функции glutInitDisplayMode(). Вместо константы GLUT_SINGLE нужно задать в дизъюнкции флагов константу GLUT_D0UBLE. Переключение функций буферов выполняется функцией glutSwapBuffers(), которая входит в состав библиотеки GLUT. Если формируется довольно сложное изображение, требующее много времени, программа может спокойно работать с фоновым буфером и это никак не скажется на регенерации ранее созданного изображения из рабочего буфера. После завершения формирования очередной фазы динамической картинки выполняется переключение буферов.

Двойная буферизация - это стандартная технология организации компьютерной анимации. Все операторы формирования изображения включаются в функцию display(), но при использовании двойной буферизации в этой функции нужно сначала очистить рабочий буфер, вызвав glClear(), а последним оператором вызвать функцию переключения буферов glutSwapBuffers().

Если используется чересстрочная развертка, четные и нечетные строки кадра выводятся попеременно и, таким образом, действительная частота регенерации равна половинной частоте кадровой развертки. При этом зритель может заметить легкое дрожание изображения по вертикали, особенно когда сидит довольно близко к экрану.


⇐ Предыдущая| |Следующая ⇒