D3D / DXGI gère la transition plein écran

9

J'ai une application D3D11 et je veux ajouter un support plein écran approprié. Maintenant, je peux laisser DXGI basculer ma fenêtre en plein écran pour moi, et j'ai l'impression que DXGI s'occupera de tout ce qui est nécessaire pour faire basculer la chaîne de swap avant et le backbuffer au lieu de les blitting.

Cependant, laisser DXGI effectuer le swich semble peu fiable avec une configuration multi-écrans - les écrans secondaires restent entièrement noirs après le changement la plupart du temps, sans raison ni motif apparent.

Il peut s'écouler plusieurs fois avant et en arrière avant que la fenêtre plein écran et le reste du bureau ne s'affichent sur les autres écrans.

Apparemment, je ne suis pas seul avec cela, Battlefield 3 et WoW semblent avoir des problèmes similaires pour beaucoup de gens.

Maintenant, la vraie question: je suppose que même ces sociétés de développement de jeux AAA ne peuvent pas faire fonctionner cela, mon plus grand espoir serait de faire en quelque sorte passer moi-même en plein écran.

Y a-t-il quelque chose que je puisse faire pour faire passer ma fenêtre / ma plateforme d'échange en mode plein écran approprié, avec retournement de tampon?


la source
Au moment d'écrire ces lignes, la version actuelle de World of Warcraft n'a plus les problèmes de configuration du mode d'affichage / les fuites de mémoire que vous avez mentionnés. Ils étaient certainement problématiques mais ont été corrigés à partir du 7.3.2
Gazer

Réponses:

3

À ma connaissance, la seule chose qui fonctionne est:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

au début de votre candidature et:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

avant de quitter. Pour les transitions, procédez comme d'habitude. J'ai essayé InvalidateRect(NULL, NULL, true)juste après le passage en plein écran en vain. J'espère que cela t'aides.

Geai
la source
Après avoir tout essayé, il semble que vous ayez raison. Seule la désactivation de la composition empêche de manière fiable que cela se produise. Pas la réponse que j'espérais, mais mieux que rien, je suppose.
Notez que Windows 8.1 et versions ultérieures ignorent ce paramètre. Vous ne pouvez pas désactiver DWM.
Chuck Walbourn du
1

Vous n'êtes en effet pas le seul à faire face à ce problème . Première chose à vérifier: assurez-vous que vous utilisez les derniers pilotes / bêta / haut de gamme pour la carte vidéo que vous utilisez.

Maintenant, je dirais qu'il n'y a qu'une petite chance que vous puissiez faire fonctionner cela mieux que l'implémentation DXGI automatique. Ce type de problème dépend fortement du fournisseur de l'adaptateur, de la version du pilote et de la configuration du moniteur. Donc, en le fixant sur une machine, vous risquez de le casser sur plus.

Je déconseille de retourner à l'âge sombre de DirectX 9 où vous deviez tout faire à la main. Une meilleure idée serait d'essayer de corriger la commutation automatique. Quelques pistes à suivre:

  • Lisez attentivement la documentation (clairsemée) .

  • Si vous ne le faites pas déjà, essayez de répondre à l' WM_SIZEévénement que vous recevez lors du passage de / à plein écran, comme décrit ici . Si vous le faites, assurez-vous que vous libérez correctement toutes les références au tampon arrière avant d'appeler ResizeBuffers, comme décrit ici . Ne pas le faire pourrait entraîner ce genre de demi-problèmes étranges.

  • Essayez de démarrer directement en plein écran et de créer votre chaîne de swap avec l'un des modes d'affichage énumérés . Si cela fonctionne tout le temps, cela peut signifier que vous n'utilisez pas l'un des modes d'affichage énumérés lors de la manipulation WM_SIZE(ou pas entièrement, des éléments tels que le taux de rafraîchissement peuvent être importants).

  • Essayez de contourner avec l'effet de swap et le nombre de tampons de votre description de chaîne de swap . Vous devriez probablement utiliser DXGI_SWAP_EFFECT_SEQUENTIALet un BufferCount> = 2. Peut-être que votre pilote ne prend pas en charge plus d'options "exotiques".

Laurent Couvidou
la source
Le redimensionnement des tampons fonctionne bien. J'ai également essayé tous les effets de swap, ils ne semblent pas faire de différence, et j'ai toujours utilisé 2 tampons. J'essaierais la chose en plein écran (même si je ne sais pas ce que vous entendez par "en utilisant l'un des modes d'affichage énumérés" - lorsque je réponds à WM_SIZE, tout ce que je fais est ResizeBuffers, il n'y a nulle part où passer un mode d'affichage comme argument ) mais j'ai installé spontanément Windows 8 et devinez quoi, je ne peux pas reproduire le problème pour le moment ..
Je suis retourné à windows7 et j'ai essayé de créer le swapchain en plein écran depuis le début, mais le problème persiste.