Что такое цепочка буферов? (Direct3D 9)
Цепочка буферов — это коллекция буферов, которые используются для отображения кадров пользователю. Каждый раз, когда приложение представляет новый кадр для отображения, первый буфер в цепочке буферов занимает место отображаемого буфера. Этот процесс называется перемещение или переворачивание.
Графический адаптер содержит указатель на поверхность, представляющую изображение, отображаемое на мониторе, называемое передним буфером. По мере обновления монитора графическая карта отправляет содержимое переднего буфера в монитор для отображения. Однако это приводит к проблеме при отрисовке графики в режиме реального времени. Суть проблемы в том, что частота обновления монитора очень медленная по сравнению с остальной частью компьютера. Общие частоты обновления варьируются от 60 Гц (60 раз в секунду) до 100 Гц. Если приложение обновляет передний буфер в то время, как монитор находится в середине обновления, отображаемое изображение будет разделяться на две части: в верхней половине дисплея будет показываться старое изображение, а на нижней — новое изображение. Эта проблема называется разрывами.
Direct3D реализует два варианта, чтобы избежать разрыва:
- Возможность разрешить только обновления монитора при операции вертикальной развертки (или вертикальной синхронизации). Монитор обычно обновляет изображение, когда луч света перемещается по горизонтали зигзагом от верхнего левого угла к правому нижнему. Когда световая закрепка достигает нижней части, монитор перекалибрует её, перемещая обратно в верхний левый угол, чтобы процесс мог начаться снова. Этот пересчет называется вертикальной синхронизацией. Во время вертикальной синхронизации монитор не рисует ничего, поэтому любое обновление переднего буфера не будет видно, пока монитор не начнет рисовать снова. Вертикальная синхронизация относительно медленна; однако недостаточно медленно, чтобы отобразить сложную сцену во время ожидания. Что необходимо, чтобы избежать разрывов и для возможности отрисовки сложных сцен — это процесс двойной буферизации.
- Вариант использования метода обратной буферизации. Обратная буферизация — это процесс рисования сцены на внеэкранной поверхности, называемой буфером назад. Обратите внимание, что любая поверхность, кроме переднего буфера, называется внеэкранной поверхностью, так как она никогда не просматривается монитором напрямую. С помощью обратного буфера приложение имеет свободу отрисовки сцены всякий раз, когда система неактивна (т. е. сообщения windows не ожидают) без необходимости учитывать частоту обновления монитора. Обратная буферизация приводит к дополнительному осложнению того, как и когда переместить буфер обратно в передний буфер.
Процесс перемещения обратного буфера в передний буфер называется переворотом поверхности. Так как графическая карта просто использует указатель на поверхность для представления переднего буфера, простое изменение указателя — это все, что необходимо для установки обратного буфера на передний буфер. Когда приложение запрашивает Direct3D представить задний буфер в передний буфер, Direct3D просто "переворачивает" два указателя поверхности. Результатом является то, что задний буфер теперь является новым передним буфером, а старый передний буфер — новый задний буфер. Перелистывание поверхности вызывается всякий раз, когда приложение запрашивает устройство Direct3D представить задний буфер; однако Direct3D можно настроить так, чтобы он ставил запросы в очередь, пока не произойдет вертикальная синхронизация. Этот параметр называется интервалом представления устройства Direct3D. Обратите внимание, что данные в новом буфере задней части могут не использоваться повторно, в зависимости от того, как приложение указывает, как Direct3D должен обрабатывать перевернутые поверхности. Переключение поверхностей является ключевым в мультимедиа, анимации и игровом программном обеспечении; это эквивалентно тому, как можно сделать анимацию с помощью блокнота бумаги. На каждой странице художник немного изменяет изображения, чтобы при быстром переворачивании листов рисунок казался анимированным.
Связанные разделы