Что такое цепочка буферов? (Direct3D 9)

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

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

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

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

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

Поверхности Direct3D

Переворачивающие поверхности (Direct3D 9)