D3D / DXGI suporta transição de tela cheia

9

Eu tenho um aplicativo D3D11 e quero adicionar o suporte adequado em tela cheia. Agora posso deixar o DXGI mudar minha janela para tela cheia para mim, e tenho a impressão de que o DXGI cuidará de tudo o que for necessário para fazer a corrente de troca girar para frente e para trás em vez de misturá-los.

No entanto, permitir que o DXGI execute o swich parece não confiável com uma configuração de vários monitores - as telas secundárias permanecem totalmente pretas após a troca a maior parte do tempo, sem motivo aparente ou padrão.

Pode demorar algumas vezes a alternância antes que a janela de tela cheia e o restante da área de trabalho sejam mostrados nas outras telas.

Aparentemente, não estou sozinho com isso, Battlefield 3 e WoW parecem ter problemas semelhantes para muitas pessoas.

Agora, a pergunta real: acho que, mesmo que essas empresas de desenvolvedores de jogos AAA não consigam fazer isso funcionar, minha maior esperança seria, de alguma forma, executar a mudança para a tela inteira.

Existe alguma coisa que eu possa fazer para elevar minha janela / swapchain para o modo de tela cheia adequado, com inversor de buffer?


fonte
No momento da redação deste artigo, a versão atual do World of Warcraft não apresentava mais os problemas de configuração do modo de exibição / vazamentos de memória mencionados. Eles eram certamente problemáticos, mas foram corrigidos a partir de 7.3.2
Gazer

Respostas:

3

Que eu saiba, a única coisa que funciona é:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

no início do seu aplicativo e:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

antes de sair. Para as transições, proceda como de costume. Eu tentei InvalidateRect(NULL, NULL, true)logo depois de mudar para tela cheia sem sucesso. Espero que isto ajude.

Jay
fonte
Depois de tentar de tudo, parece que você está correto. Somente desabilitar a composição com segurança impede que isso aconteça. Não é a resposta que eu esperava, mas melhor do que nada, suponho.
Observe que o Windows 8.1 e versões posteriores ignoram essa configuração. Você não pode desativar o DWM.
Chuck Walbourn
1

Na verdade, você não é o único a enfrentar esse problema . Primeira coisa a verificar: verifique se você está usando os drivers / beta / topo de linha mais recentes para a placa de vídeo que está usando.

Agora, eu diria que há apenas uma pequena chance de você conseguir fazer isso funcionar melhor do que a implementação automática de DXGI. Esse tipo de problema depende muito do fornecedor do adaptador, da versão do driver e da configuração do monitor. Portanto, ao fixá-lo em uma máquina, você pode acabar quebrando mais.

Aconselho não voltar à idade das trevas do DirectX 9, onde você tinha que fazer tudo manualmente. Uma idéia melhor seria tentar consertar a comutação automática. Algumas trilhas a seguir:

  • Leia a documentação (esparsa) com cuidado.

  • Se você ainda não estiver fazendo isso, tente responder ao WM_SIZEevento que você recebe ao mudar de / para tela cheia, conforme descrito aqui . Se você fizer isso, verifique se está lançando corretamente todas as referências ao buffer de fundo antes de chamar ResizeBuffers, conforme descrito lá . Não fazer isso pode causar esse tipo de meio-problema estranho.

  • Tente iniciar diretamente em tela cheia e criar sua cadeia de troca com um dos modos de exibição enumerados . Se isso funcionar o tempo todo, isso pode significar que você não está usando um dos modos de exibição enumerados ao manipular WM_SIZE(ou não inteiramente, coisas como a taxa de atualização podem ser importantes).

  • Tente mexer com o efeito de troca e a contagem de buffer da descrição da sua cadeia de troca . Você provavelmente deveria estar usando DXGI_SWAP_EFFECT_SEQUENTIALe um BufferCount> = 2. Talvez seu driver não tenha suporte para mais opções "exóticas".

Laurent Couvidou
fonte
Redimensionar os buffers funciona bem. Eu também tentei todos os efeitos de troca, eles não parecem fazer diferença, e eu sempre usei 2 buffers. Eu tentaria a tela cheia (embora eu não saiba o que você quer dizer com "usando um dos modos de exibição enumerados" - ao responder a WM_SIZE tudo o que faço é ResizeBuffers, não há lugar para passar um modo de exibição como argumento ) mas eu espontaneamente o Windows 8 instalado e adivinhem, eu não pode replicar o problema agora ..
Voltou ao windows7 e tentou criar o swapchain em tela cheia desde o início, mas o problema persiste.