Cadeias de trocaSwap chains

Uma cadeia de troca é uma coleção de buffers que são usados para exibir quadros para o usuário.A swap chain is a collection of buffers that are used for displaying frames to the user. Cada vez que um aplicativo apresenta um novo quadro para exibição, o primeiro buffer da cadeia de troca assume o lugar do buffer exibido.Each time an application presents a new frame for display, the first buffer in the swap chain takes the place of the displayed buffer. Esse processo é chamado troca ou inversão.This process is called swapping or flipping.

Um adaptador gráfico contém um ponteiro para uma superfície que representa a imagem que está sendo exibida no monitor, chamado de um buffer frontal.A graphics adapter holds a pointer to a surface that represents the image being displayed on the monitor, called a front buffer. Como o monitor é atualizado, a placa gráfica envia o conteúdo do buffer frontal para o monitor para ser exibido.As the monitor is refreshed, the graphics card sends the contents of the front buffer to the monitor to be displayed. No entanto, isso leva a um problema de "divisão" durante a renderização de gráficos em tempo real.However, this leads to a "tearing" problem when rendering real-time graphics. O coração do problema é que as taxas de atualização do monitor são muito lentas em comparação com o restante do computador.The heart of the problem is that monitor refresh rates are very slow in comparison to the rest of the computer. As taxas de atualização comuns variam de 60 Hz (60 vezes por segundo) a 100 Hz.Common refresh rates range from 60 Hz (60 times per second) to 100 Hz.

Se seu aplicativo está atualizando o buffer frontal enquanto o monitor está no meio de uma atualização, a imagem exibida será recortada na metade com a metade superior da tela que contém a imagem anterior e a metade inferior que contém a nova imagem.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. Esse problema é conhecido como desmembramento.This problem is referred to as tearing.

Evitando a divisãoAvoiding tearing

O Direct3D implementa duas opções para evitar a divisão:Direct3D implements two options to avoid tearing:

  • Uma opção para permitir somente as atualizações de monitor na operação de retorno vertical (ou sincronização vertical).An option to only allow updates of the monitor on the vertical retrace (or vertical sync) operation. Um monitor normalmente atualiza sua imagem, movendo um marcador de luz horizontalmente, fazendo um movimento em zigue-zague na parte superior esquerda do monitor e terminando na parte inferior direita.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. Quando o marcador de luz atinge a parte inferior, o monitor calibra novamente o marcador de luz, movendo-o novamente para o canto superior esquerdo para que o processo possa iniciar novamente.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.

    Esta recalibragem é chamada de sincronização vertical. Durante uma sincronização vertical, nada é desenhado no monitor, portanto, qualquer atualização para o buffer frontal não será vista até o monitor comece a desenhar novamente.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. A sincronização vertical é relativamente lenta, no entanto, não lenta o suficiente para renderizar uma cena complexa durante o tempo de espera.The vertical sync is relatively slow; however, not slow enough to render a complex scene while waiting. O que é necessário para evitar o desmembramento e ser capaz de renderizar cenas complexas é um processo chamado de armazenamento em buffer de fundo.What is needed to avoid tearing and be able to render complex scenes is a process called back buffering.

  • Uma opção para usar uma técnica chamada de armazenamento em buffer de fundo.An option to use a technique called back buffering. O armazenamento em buffer de trás é o processo de desenhar uma cena em uma superfície fora da tela, chamada de buffer de fundo.Back buffering is the process of drawing a scene to an off-screen surface, called a back buffer. Qualquer superfície que não seja o buffer frontal é chamada de superfície fora da tela, porque ela nunca é visualizada diretamente pelo monitor.Any surface other than the front buffer is called an off-screen surface because it is never directly viewed by the monitor.

    Usando um buffer de fundo, um aplicativo tem a liberdade de renderizar uma cena sempre que o sistema estiver ocioso (ou seja, não há mensagens do Windows esperando) sem precisar considerar a taxa de atualização do 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. O armazenamento em buffer de fundo traz uma complicação adicional sobre como e quando mover o buffer de fundo para o buffer frontal.Back buffering brings in an additional complication of how and when to move the back buffer to the front buffer.

Inversão de superfícieSurface flipping

O processo de mover o buffer de fundo para o buffer frontal é chamado de inversão de superfície.The process of moving the back buffer to the front buffer is called surface flipping. Como a placa gráfica simplesmente usa um ponteiro para uma superfície para representar o buffer frontal, uma simples alteração no ponteiro é tudo o que é necessário para definir o buffer de fundo no buffer frontal.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. Quando um aplicativo solicita ao Direct3D para apresentar o buffer de fundo no buffer frontal, o Direct3D simplesmente "vira" os dois ponteiros de superfície.When an application asks Direct3D to present the back buffer to the front buffer, Direct3D simply "flips" the two surface pointers. O resultado é que o buffer de fundo agora é o novo buffer frontal e o buffer frontal antigo é o novo buffer de fundo.The result is that the back buffer is now the new front buffer, and the old front buffer is the new back buffer.

A inversão de superfície é invocada sempre que um aplicativo solicita ao dispositivo Direct3D para apresentar o buffer de fundo, no entanto, você pode configurar o Direct3D para enfileirar as solicitações até que uma sincronização vertical ocorra.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. Essa opção é conhecida como intervalo de apresentação do dispositivo Direct3D.This option is referred to as the Direct3D device's presentation interval. Os dados no buffer de fundo novo podem não ser reutilizáveis, dependendo de como um aplicativo especifica a forma como o Direct3D deve tratar a inversão de superfície.The data in the new back buffer may not be reusable, depending on how an application specifies how Direct3D should handle surface flipping.

A inversão de superfície é fundamental para multimídia, animação e software de jogo; ela é equivalente à maneira como você faz animações usando uma folha de papel.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. Em cada página, o artista muda as figuras ligeiramente, para que ao navegar rapidamente entre as folhas, o desenho pareça animado.On each page, the artist changes the figures slightly, so that when you flip rapidly between sheets, the drawing appears animated.

Tópicos relacionadosRelated topics

DispositivosDevices