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

Цепочка буферов — это коллекция буферов для отображения кадров пользователю.A swap chain is a collection of buffers that are used for displaying frames to the user. Каждый раз, когда приложение представляет новый кадр для отображение, первый буфер в цепочке буферов занимает место отображаемого буфера.Each time an application presents a new frame for display, the first buffer in the swap chain takes the place of the displayed buffer. Этот процесс называется развертыванием или переключением.This process is called swapping or flipping.

Графический адаптер хранит указатель на поверхность с изображением, отображаемым на мониторе. Эта поверхность называется кадровым буфером.A graphics adapter holds a pointer to a surface that represents the image being displayed on the monitor, called a front buffer. По мере обновления монитора, графическая плата отправляет содержимое кадрового буфера для показа на мониторе.As the monitor is refreshed, the graphics card sends the contents of the front buffer to the monitor to be displayed. Однако это может привести к проблеме «разрывов» при отображении графики в режиме реального времени.However, this leads to a "tearing" problem when rendering real-time graphics. Причина проблемы заключается в том частота обновления монитора гораздо медленнее по сравнению с остальным компьютером.The heart of the problem is that monitor refresh rates are very slow in comparison to the rest of the computer. Обычно частота обновления варьируются от 60 Гц (60 раз в секунду) до 100 Гц.Common refresh rates range from 60 Hz (60 times per second) to 100 Hz.

Если приложение обновит кадровый буфер пока монитор находится в середине обновления, показанное изображение будет разрезано пополам, при этом в верхней части будет старое изображение, а в нижней новое.If your application is updating the front buffer while the monitor is in the middle of a refresh, the image that is displayed will be cut in half with the upper half of the display containing the old image and the lower half containing the new image. Эта проблема называется разрывами.This problem is referred to as tearing.

Как избежать разрывAvoiding tearing

В Direct3D реализовано два варианта предотвращения разрывов:Direct3D implements two options to avoid tearing:

  • Первый вариант — разрешить обновления монитора только при операции вертикального обратного хода (или вертикальной синхронизации).An option to only allow updates of the monitor on the vertical retrace (or vertical sync) operation. Монитор обычно обновляет свое изображение, перемещая точечный свет горизонтально, зигзагами от верхнего левого угла к нижнему правому.A monitor typically refreshes its image by moving a light pin horizontally, zigzagging from the top left of the monitor and ending at the bottom right. Когда точечный свет доходит до низа, монитор повторно калибрует его, перемещая точечный свет обратно в верхний левый угол для повторения цикла.When the light pin reaches the bottom, the monitor recalibrates the light pin by moving it back to the upper left so that the process can start again.

    Такую повторную калибровку называют вертикальной синхронизацией. Во время вертикальной синхронизации монитор ничего не рисует, поэтому любое обновление в кадровый буфер не будет показано, пока монитор снова не начнет цикл отрисовки.This recalibration is called a vertical sync. During a vertical sync, the monitor is not drawing anything, so any update to the front buffer will not be seen until the monitor starts to draw again. Вертикальная синхронизация проходит довольно медленно, однако не настолько медленно, чтобы успеть прорисовать сложную сцену.The vertical sync is relatively slow; however, not slow enough to render a complex scene while waiting. Чтобы избежать разрывов и отобразить сложную сцены, нужен процесс, который называется задней (фоновой) буферизацией.What is needed to avoid tearing and be able to render complex scenes is a process called back buffering.

  • Вариант с использованием метода задней буферизации.An option to use a technique called back buffering. Задняя буферизация — это процесс рисования сцены на плоскость вне экрана, которая называется задним буфером.Back buffering is the process of drawing a scene to an off-screen surface, called a back buffer. Любая поверхность, отличная от кадрового буфера, называется плоскостью вне экрана, которая никогда напрямую не отображается на мониторе.Any surface other than the front buffer is called an off-screen surface because it is never directly viewed by the monitor.

    С помощью заднего буфера приложение имеет возможность рисовать сцену при всяком простое системы (то есть когда нет ожидающих обработки оконных сообщений)без необходимости учитывать частоту обновления монитора.By using a back buffer, an application has the freedom to render a scene whenever the system is idle (that is, no windows messages are waiting) without having to consider the monitor's refresh rate. Задняя буферизация подразумевает одну дополнительную сложность — когда и как перемещать задний буфер в кадровый буфер.Back buffering brings in an additional complication of how and when to move the back buffer to the front buffer.

Переворот поверхностиSurface flipping

Процесс перемещения заднего буфера в кадровый буфер называется зеркальным отображением.The process of moving the back buffer to the front buffer is called surface flipping. Так как графическая плата просто использует указатель на поверхность для представления кадрового буфера, то для переключения заднего буфера на кадровый требуется простая смена указателя.Because the graphics card simply uses a pointer to a surface to represent the front buffer, a simple pointer change is all that is needed to set the back buffer to the front buffer. Когда приложение посредством Direct3D отправляет задний буфер в кадровый буфер, Direct3D просто «зеркально отражает» (можно сказать переворачивает) два указателя на поверхности.When an application asks Direct3D to present the back buffer to the front buffer, Direct3D simply "flips" the two surface pointers. Результат — задний буфер станет новым кадровым буфером, а старый кадровый буфер новым задним.The result is that the back buffer is now the new front buffer, and the old front buffer is the new back buffer.

Переворот поверхности вызывается каждый раз, когда приложение запрашивает Direct3D устройство показать задний буфер. Однако Direct3D может быть настроен так, что ставить эти запросы в очереди, пока не начнется вертикальная синхронизации.A surface flip is invoked whenever an application asks the Direct3D device to present the back buffer; however, Direct3D can be set up to queue the requests until a vertical sync occurs. Этот вариант называется интервалом презентации Direct3D устройства.This option is referred to as the Direct3D device's presentation interval. Данные в новом заднем буфере могут быть не пригодны для повторного использования, это зависит от того, как приложение настроило Direct3D на обработку зеркального отражения поверхностей.The data in the new back buffer may not be reusable, depending on how an application specifies how Direct3D should handle surface flipping.

Зеркальное отражение очень важно в мультимедийных, анимационных приложениях и играх, это способ поход на анимирование персонажей на листах блокнота.Surface flipping is key in multimedia, animation, and game software; it is equivalent to the way you can do animation with a pad of paper. На каждой странице художник слегка меняет фигуры, так что при быстром пролистывании блокнота рисунок кажется анимированным.On each page, the artist changes the figures slightly, so that when you flip rapidly between sheets, the drawing appears animated.

Связанные разделыRelated topics

УстройстваDevices