Modelo flip DXGI
O Windows 8 adiciona suporte para o modelo de apresentação flip e suas estatísticas presentes associadas no DXGI 1.2. O modelo de apresentação de flip DXGI do Windows 8 é semelhante ao de apresentação do modo de flip Direct3D 9EX do Windows 7. Os aplicativos de apresentação baseados em vídeo ou taxa de quadros, como jogos, podem se beneficiar mais usando o modelo de apresentação invertida. Os aplicativos que usam o modelo de apresentação invertida DXGI reduzem a carga de recursos do sistema e aumentam o desempenho. Os aplicativos também podem usar aprimoramentos de estatísticas atuais com o modelo de apresentação flip para controlar melhor a taxa de apresentação, fornecendo feedback em tempo real e mecanismos de correção.
- Comparando o modelo flip DXGI e o modelo BitBlt
- Como usar o modelo de flip DXGI
- Sincronização de quadros de aplicativos de modelo de flip DXGI
- Evitar, detetar e recuperar de falhas
- Tópicos relacionados
Comparando o modelo flip DXGI e o modelo BitBlt
O tempo de execução usa a transferência de bloco de bits (bitblt) e os modelos de apresentação invertida para apresentar conteúdo gráfico em monitores de exibição. A maior diferença entre os modelos de apresentação bitblt e flip é como o conteúdo do back-buffer chega ao DWM do Windows 8 para composição. No modelo bitblt, o conteúdo do buffer traseiro é copiado para a superfície de redirecionamento em cada chamada para IDXGISwapChain1::P resent1. No modelo flip, todos os buffers traseiros são compartilhados com o Desktop Window Manager (DWM). Portanto, o DWM pode compor diretamente desses buffers traseiros sem quaisquer operações de cópia adicionais. Em geral, o modelo flip é mais eficiente. O modelo flip também fornece mais recursos, como estatísticas de presentes aprimoradas.
Se você tiver componentes herdados que usam o Windows Graphics Device Interface (GDI) para gravar em um HWND diretamente, use o modelo bitblt.
As melhorias de desempenho do modelo de flip DXGI são significativas quando o aplicativo está no modo de janela. A sequência nesta tabela e a ilustração comparam os usos de largura de banda de memória e as leituras e gravações do sistema de aplicativos em janela que escolhem o modelo flip versus o modelo bitblt.
Passo | Modelo BitBlt apresentado ao DWM | Modelo flip DXGI presente ao DWM |
---|---|---|
1. | O aplicativo atualiza seu quadro (Gravação) |
O aplicativo atualiza seu quadro (Gravação) |
2. | O tempo de execução do Direct3D copia o conteúdo da superfície para uma superfície de redirecionamento DWM (Leitura, Gravação) |
O tempo de execução do Direct3D passa a superfície do aplicativo para o DWM |
3. | Após a conclusão da cópia da superfície compartilhada, o DWM renderiza a superfície do aplicativo na tela (Leitura, Gravação) |
O DWM renderiza a superfície do aplicativo na tela (Leitura, Gravação) |
O modelo Flip reduz o uso de memória do sistema reduzindo o número de leituras e gravações pelo tempo de execução do Direct3D para a composição de quadros em janela pelo DWM.
Como usar o modelo flip DXGI
Os aplicativos Direct3D 11.1 destinados ao Windows 8 usam o modelo de inversão criando a cadeia de permuta com o valor de enumeração DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL definido no SwapEffect membro da estrutura DXGI_SWAP_CHAIN_DESC1. Quando você define SwapEffect como DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, também defina esses membros de DXGI_SWAP_CHAIN_DESC1 para os valores indicados:
- BufferCount a um valor entre 2 e 16 para evitar uma penalidade de desempenho como resultado da espera no DWM para liberar o buffer de apresentação anterior.
- Formatar para DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM ou DXGI_FORMAT_R8G8B8A8_UNORM
- Contar membro da estrutura de DXGI_SAMPLE_DESC que o membro SampleDesc especifica para um e o membro Quality de DXGI_SAMPLE_DESC para zero porque não há suporte para suavização de borda de amostra múltipla (MSAA)
Se utilizar DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL no sistema operativo Windows 7 ou anterior, a criação do dispositivo falhará. Quando você usa o modelo flip, você pode usar estatísticas presentes em tela cheia no modo de janela. O comportamento em tela cheia não é afetado. Se você passar NULL para o parâmetro pFullscreenDesc de IDXGIFactory2::CreateSwapChainForHwnd para uma cadeia de permuta em janela e definir SwapEffect para DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, o tempo de execução criará um buffer traseiro extra e girará qualquer identificador pertencente ao buffer que se torna o buffer frontal no momento da apresentação.
Ao usar o modelo flip, considere estas dicas:
- Use uma cadeia de permuta de modelo flip por HWND. Não direcione várias cadeias de troca de modelo flip para o mesmo HWND.
- Não use a cadeia de permuta de modelo flip com aScrollWindowda GDI ou função de ScrollWindowEx. Alguns aplicativos Direct3D usam o ScrollWindow da GDI e funções de ScrollWindowEx para atualizar o conteúdo da janela após a ocorrência de um evento de rolagem do usuário. ScrollWindow e ScrollWindowEx executar bitblts do conteúdo da janela na tela enquanto o usuário rola uma janela. Essas funções também exigem atualizações de modelo bitblt para conteúdo GDI e Direct3D. Os aplicativos que usam qualquer uma das funções não necessariamente exibirão o conteúdo visível da janela rolando na tela quando o aplicativo estiver no modo de janela. Recomendamos que você não use o ScrollWindow da GDI e funções de ScrollWindowEx e, em vez disso, redesenhe o conteúdo GDI e Direct3D na tela em resposta à rolagem.
- Use o modelo flip em umHWNDque não seja também direcionado por outras APIs, incluindo o modelo de apresentação bitblt DXGI, outras versões do Direct3D ou GDI. Como o modelo bitblt mantém uma cópia adicional da superfície, você pode adicionar GDI e outros conteúdos Direct3D ao mesmo HWND por meio de atualizações fragmentadas do Direct3D e GDI. Quando você usa o modelo de inversão, somente o conteúdo Direct3D nas cadeias de permuta de modelo de inversão que o tempo de execução passa para o DWM são visíveis. O tempo de execução ignora todas as outras atualizações de conteúdo Direct3D ou GDI do modelo bitblt.
Sincronização de quadros de aplicativos de modelo de inversão DXGI
As estatísticas atuais são informações de temporização de quadros que os aplicativos de mídia usam para sincronizar fluxos de vídeo e áudio e recuperar de falhas de reprodução de vídeo. Os aplicativos podem usar as informações de tempo de quadros nas estatísticas atuais para ajustar a taxa de apresentação de seus quadros de vídeo para uma apresentação mais suave. Para obter informações estatísticas atuais, chame o IDXGISwapChain::GetFrameStatistics método para obter a estrutura DXGI_FRAME_STATISTICS. DXGI_FRAME_STATISTICS contém estatísticas sobre chamadas de IDXGISwapChain1::P resent1. Uma cadeia de permuta de modelo flip fornece informações estatísticas presentes nos modos de janela e tela cheia. Para cadeias de permuta de modelo bitblt no modo de janela, todos os valores DXGI_FRAME_STATISTICS são zeros.
Para estatísticas de apresentação de modelo invertido, IDXGISwapChain::GetFrameStatistics retorna DXGI_ERROR_FRAME_STATISTICS_DISJOINT nestas situações:
- Primeira chamada para GetFrameStatistics, que indica o início de uma sequência
- Mudança de modo: modo de janela de ou para transições de tela cheia ou tela cheia para tela cheia
Os valores em PresentRefreshCount, SyncRefreshCounte SyncQPCTime membros do DXGI_FRAME_STATISTICS têm as seguintes características:
- PresentRefreshCount é igual a SyncRefreshCount quando o aplicativo é apresentado em cada vsync.
- SyncRefreshCount é obtido no intervalo vsync quando o presente foi enviado, SyncQPCTime é aproximadamente o tempo associado ao intervalo vsync.
O métodoIDXGISwapChain::GetLastPresentCount retorna a última contagem presente, ou seja, a ID atual da última bem-sucedida IDXGISwapChain1::P resent1 chamada feita por um dispositivo de exibição associado à cadeia de permuta. Esse ID presente é o valor do PresentCount membro da estrutura DXGI_FRAME_STATISTICS. Para cadeias de permuta de modelo bitblt, enquanto no modo de janela, todos os valores DXGI_FRAME_STATISTICS são zeros.
Evitar, detetar e recuperar de falhas
Execute estas etapas para evitar, detetar e recuperar de falhas na apresentação do quadro:
A fila IDXGISwapChain1::P resent1 chamadas (ou seja, chama IDXGISwapChain1::P resent1 várias vezes, o que faz com que eles coletem em uma fila).
Crie uma estrutura de fila presente para armazenar todos os enviados com êxito IDXGISwapChain1::P resent1ID atual (retornado por IDXGISwapChain::GetLastPresentCount) e valores de associados, calculados/esperados PresentRefreshCount.
Para detetar uma falha:
- Ligue IDXGISwapChain::GetFrameStatistics.
- Para este quadro, obtenha o ID atual (PresentCount) e vsync count onde o sistema operacional apresentou a última imagem para o monitor (PresentRefreshCount).
- Recupere o esperado PresentRefreshCount que está associado à ID atual e que você armazenou anteriormente na estrutura da fila presente.
- Se o real PresentRefreshCount for posterior ao esperado PresentRefreshCount, ocorreu uma falha.
Para recuperar da falha:
Calcule o número de quadros a serem ignorados para se recuperar da falha. Por exemplo, se a etapa 3 revelar que a contagem de vsync esperada (PresentRefreshCount) para uma ID atual (PresentCount) é 5 e a contagem de vsync real para a ID atual é 8, o número de quadros a serem ignorados para recuperar da falha é de 3 quadros.
Passe 0 para o parâmetro SyncInterval neste número de chamadas para IDXGISwapChain1::P resent1 para descartar e ignorar esse número de quadros.
Observação
Se a falha consistir em um grande número de quadros, chame IDXGISwapChain1::P resent1 com o parâmetro Flags definido para DXGI_PRESENT_RESTART descartar e ignorar todos os presentes pendentes na fila.
Aqui está um exemplo de cenário de recuperação de falhas na apresentação do quadro:
No cenário de exemplo, você espera que o quadro A vá para a tela em uma contagem de vsync de 1. Mas você realmente deteta a contagem de vsync que o quadro A aparece na tela como 4. Portanto, você determina que ocorreu uma falha. Em seguida, você pode descartar 3 quadros, ou seja, pode passar 0 para o parâmetro SyncInterval em 3 chamadas para IDXGISwapChain1::P resent1. No cenário de exemplo anterior, para se recuperar da falha, você precisa de um total de 8 IDXGISwapChain1::P resent1 chamadas. O 9º quadro é então visível de acordo com a contagem de vsync que você espera.
Aqui está uma linha do tempo dos eventos de apresentação. Cada linha vertical representa um vsync. A direção horizontal é o tempo, que aumenta para a direita. Você pode usar a figura para imaginar como as falhas podem ocorrer.
A figura ilustra esta sequência:
O aplicativo acorda no vsync, renderiza azul, chama IDXGISwapChain1::P resent1e, em seguida, volta ao modo de suspensão.
A unidade de processamento gráfico (GPU) acorda da ociosidade, executa a renderização para azul e, em seguida, volta ao modo de suspensão.
O DWM acorda no próximo vsync, compõe azul em seu buffer traseiro, chama IDXGISwapChain1::P resent1e, em seguida, volta ao modo de suspensão.
O aplicativo acorda, renderiza verde, chama IDXGISwapChain1::P resent1e, em seguida, volta ao modo de suspensão.
Observação
O aplicativo é executado simultaneamente enquanto a GPU executa a composição de azul.
Em seguida, a GPU renderiza verde para o aplicativo.
Finalmente, o conversor digital para analógico (DAC) mostra os resultados da composição DWM no monitor no próximo vsync.
A partir da linha do tempo, você pode imaginar a latência das estatísticas atuais e como as falhas podem ocorrer. Por exemplo, para mostrar uma falha DWM para a cor verde que aparece na tela, imagine ampliar a caixa verde/vermelha para que o lado direito da caixa verde/vermelha corresponda ao lado direito da caixa roxa/vermelha. Nesse cenário, o DAC mostra dois quadros de azul e, em seguida, o quadro verde. Você pode ver que essa falha ocorreu a partir da leitura das estatísticas atuais.
Tópicos relacionados