2010-04-19 30 views
2

J'ai écrit un jeu gratuit il y a quelques années: http://www.walkover.org. Pour le lobby et les menus, il utilise des dialogues normaux comme win32. Lorsque le jeu commence, il utilise OpenGL. Maintenant, sous Windows 7, lorsque le jeu commence, il éteint le verre de Windows et le rallume quand le jeu est terminé.Mon jeu OpenGL bascule Aero DWM Glass

Y a-t-il quelque chose que je puisse faire pour éviter que cela ne se produise? Des drapeaux spéciaux qui gardent le verre allumé s'il est allumé? (Pour les plus récents, j'utilise DirectX et cela n'arrive pas là.) Peut-être un (nouveau) drapeau que je dois spécifier quelque part?

J'utilise ce PIXELFORMATDESCRIPTOR:

static PIXELFORMATDESCRIPTOR pfd = 
    { 
     sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd 
     1,        // version number 
     PFD_DRAW_TO_WINDOW |   // support window 
      PFD_SUPPORT_OPENGL |   // support OpenGL 
      PFD_DOUBLEBUFFER,    // double buffered 
     PFD_TYPE_RGBA,     // RGBA type 
     32,        // 24-bit color depth 
     0, 0, 0, 0, 0, 0,    // color bits ignored 
     0,        // no alpha buffer 
     0,        // shift bit ignored 
     0,        // no accumulation buffer 
     0, 0, 0, 0,      // accum bits ignored 
     0,        // 32-bit z-buffer 
     0,        // no stencil buffer 
     0,        // no auxiliary buffer 
     PFD_MAIN_PLANE,     // main layer 
     0,        // reserved 
     0, 0, 0       // layer masks ignored 
    }; 
+0

est une application en plein écran ou fenêtré? Pour une application en plein écran, cela ne devrait pas vous intéresser, et pour une application fenêtrée, la raison pour laquelle DirectX agit différemment est que DWM lui-même utilise DirectX, pas OpenGL. –

+0

C'est en plein écran, mais ce n'est pas exigeant sur le matériel. Donc, si la commutation à une application de la fenêtre le fixe. Je ferais ça. Mais je n'ai aucune idée de comment. Btw. J'ai trouvé ce site: http://encelo.netsons.org/programming/opengl Il y a quelques exemples ouverts à ce sujet. Ils sont à partir de 2005 et en mode fenêtre, 16 bits, mais dwm reste allumé. Cependant, ils utilisent sdl pour initialiser la surface opengl. :/ – marc40000

Répondre

0

Je ne sais pas exactement ce que vous faites qui est à l'origine, mais il est probablement tout aussi bien - l'implémentation OpenGL de Microsoft dans Windows 7 est pas tout à fait parfait, à Mets-le bien. En fait, dans la plupart de mon code OpenGL, j'ai pris l'habitude d'éteindre explicitement le DWM. Sinon, les bogues dans l'implémentation de Microsoft l'empêchent fondamentalement de fonctionner. Bien que je puisse travailler dans une certaine mesure à d'autres égards, la performance est si faible qu'elle rend le code essentiellement inutilisable de toute façon (je n'ai pas fait de mesures sérieuses, mais à première vue, je dirais au moins 5: 1 performance perte).

1

Je pense que cela peut arriver si vous créez un contexte de rendu OpenGL incompatible avec Aero Glass. IIRC l'un des cas qui peuvent provoquer cela est si vous créez une fenêtre en utilisant la couleur 16 bits. Aero Glass ne peut pas afficher en couleur 16 bits, donc pour des raisons techniques, Windows doit désactiver complètement Aero Glass (même si seule votre application l'utilise). Essayez d'utiliser la couleur 32 bits.

Il se peut que d'autres paramètres le désactivent pour des raisons similaires. En bref, vérifiez tous les paramètres avec lesquels vous créez OpenGL et pensez "Aero Glass s'éteindrait-il si le bureau était basculé sur ce mode?".

+0

Hah, oh bien. Ce jeu est si vieux, j'ai complètement oublié que j'initialise OpenGL en 16bit. Vous avez raison, cela aurait du sens d'être la cause. Je vais essayer de le modifier et de rendre compte. – marc40000

+0

Non, j'ai changé le 16bit en 32 ou 24, toujours le même effet. Est-ce généralement impossible de le faire? J'ai ajouté le Pixelformatdescriptor que j'utilise ci-dessus dans ma question. – marc40000

4

Ce problème est dû à toutes les conditions suivantes:

  • Windows 7
  • OpenGL
  • Création d'une fenêtre qui correspond à votre rect écran exactement (Fullscreen)
  • Appel buffers Swap pour la deuxième
  • Anciens pilotes de carte graphique

J'ai le même problème et j'ai testé 2 moteurs de jeu AAA qui utilisent OpenGL et peuvent confirmer qu'ils avaient tous deux le même problème. DirectX semble non affecté.

Cela signifie que votre fenêtre créer est bien, ce n'est pas un problème de code.

Je vous recommande de mettre à jour les pilotes de votre carte graphique pour résoudre le problème.

Un travail à court terme autour j'ai trouvé était de créer une fenêtre qui est 1 pixel plus grand que votre résolution d'écran (sur la largeur ou hauteur)

Cette fenêtre tricks en ne pas détecter que vous êtes allés en plein écran et doesn ne déclenche pas le problème.

0

Une fois, je rencontré un problème dans ma demande que GDI ne pouvait pas lire le contenu de la fenêtre-rendus OpenGL en essayant de faire BitBlt de la fenêtre DC. C'était à l'époque quand Vista vient de sortir. Utiliser PFD_SUPPORT_GDI contournerait cela, mais cela désactiverait aussi Aero. Je suppose que ce problème a brisé beaucoup d'anciennes applications, de sorte qu'elles l'ont forcé à être activé dans certains cas. Je ne sais pas quel est votre cas ici. Je parierais sur un problème de talon de pilote.

Juste ma propre expérience limitée avec OpenGL, Aero et GDI.