Цепочки буферов

Цепочка буферов — это коллекция буферов для отображения кадров пользователю. Каждый раз, когда приложение представляет новый кадр для отображение, первый буфер в цепочке буферов занимает место отображаемого буфера. Этот процесс называется переключение или переворачивание.

Графический адаптер хранит указатель на поверхность с изображением, отображаемым на мониторе. Эта поверхность называется кадровым буфером. По мере обновления монитора, графическая плата отправляет содержимое кадрового буфера для показа на мониторе. Однако это может привести к проблеме «разрывов» при отображении графики в режиме реального времени. Причина проблемы заключается в том частота обновления монитора гораздо медленнее по сравнению с остальным компьютером. Обычно частота обновления варьируются от 60 Гц (60 раз в секунду) до 100 Гц.

Если приложение обновит кадровый буфер пока монитор находится в середине обновления, показанное изображение будет разрезано пополам, при этом в верхней части будет старое изображение, а в нижней новое. Эта проблема называется разрывами.

Избегайте разрыва

В Direct3D реализовано два варианта предотвращения разрывов:

  • Первый вариант — разрешить обновления монитора только при операции вертикального обратного хода (или вертикальной синхронизации). Монитор обычно обновляет свое изображение, перемещая точечный свет горизонтально, зигзагами от верхнего левого угла к нижнему правому. Когда точечный свет доходит до низа, монитор повторно калибрует его, перемещая точечный свет обратно в верхний левый угол для повторения цикла.

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

  • Вариант с использованием метода задней буферизации. Задняя буферизация — это процесс рисования сцены на плоскость вне экрана, которая называется задним буфером. Любая поверхность, отличная от кадрового буфера, называется плоскостью вне экрана, которая никогда напрямую не отображается на мониторе.

    С помощью заднего буфера приложение имеет возможность рисовать сцену при всяком простое системы (то есть когда нет ожидающих обработки оконных сообщений)без необходимости учитывать частоту обновления монитора. Задняя буферизация подразумевает одну дополнительную сложность — когда и как перемещать задний буфер в кадровый буфер.

Зеркальное отражение поверхности

Процесс перемещения заднего буфера в кадровый буфер называется зеркальным отображением. Так как графическая плата просто использует указатель на поверхность для представления кадрового буфера, то для переключения заднего буфера на кадровый требуется простая смена указателя. Когда приложение посредством Direct3D отправляет задний буфер в кадровый буфер, Direct3D просто «зеркально отражает» (можно сказать переворачивает) два указателя на поверхности. Результат — задний буфер станет новым кадровым буфером, а старый кадровый буфер новым задним.

Переворот поверхности вызывается каждый раз, когда приложение запрашивает Direct3D устройство показать задний буфер. Однако Direct3D может быть настроен так, что ставить эти запросы в очереди, пока не начнется вертикальная синхронизации. Этот вариант называется интервалом презентации Direct3D устройства. Данные в новом заднем буфере могут быть не пригодны для повторного использования, это зависит от того, как приложение настроило Direct3D на обработку зеркального отражения поверхностей.

Зеркальное отражение очень важно в мультимедийных, анимационных приложениях и играх, это способ поход на анимирование персонажей на листах блокнота. На каждой странице художник слегка меняет фигуры, так что при быстром пролистывании блокнота рисунок кажется анимированным.

Устройства