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?
Respostas:
Que eu saiba, a única coisa que funciona é:
no início do seu aplicativo e:
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.fonte
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_SIZE
evento 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 chamarResizeBuffers
, 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_SEQUENTIAL
e umBufferCount
> = 2. Talvez seu driver não tenha suporte para mais opções "exóticas".fonte