我的OpenGL游戏关闭了Aero DWM Glass

时间:2010-04-19 22:48:55

标签: windows opengl aero aero-glass dwm

几年前我写了一个免费游戏:http://www.walkover.org。对于大厅和菜单,它使用常规对话框,如win32。当实际游戏开始时,它使用OpenGL。

现在,在Windows 7上,当实际游戏开始时,它会关闭Windows aero glass并在游戏结束时将其重新打开。

我能做些什么来防止这种情况发生?一些特殊的标志,如果它打开,玻璃打开? (对于较新的,我一直在使用DirectX,这不会发生在那里。)也许某些(新)标志我必须在某处指定?

我正在使用这个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
    };

4 个答案:

答案 0 :(得分:5)

此问题是由以下所有原因引起的:

  • Windows 7
  • 的OpenGL
  • 创建一个与您的屏幕截面完全匹配的窗口(全屏)
  • 第二次调用交换缓冲区
  • 旧显卡驱动程序

我有同样的问题,我测试了2个使用OpenGL的AAA游戏引擎,可以确认它们都有同样的问题。 DirectX似乎没有受到影响。

这意味着你的窗口创建很好,这不是代码问题。

我建议您更新显卡驱动程序以解决问题。

我发现的一个短期工作是创建一个比屏幕分辨率大1个像素的窗口(宽度或高度)

这使得窗口不能检测到你已经进入全屏并且没有触发问题。

答案 1 :(得分:1)

我认为如果您创建一个与Aero Glass不兼容的OpenGL渲染上下文,就会发生这种情况。 IIRC可能导致这种情况的一种情况是,如果您使用16位颜色创建窗口。 Aero Glass无法呈现16位颜色,因此出于某些技术原因,Windows必须完全禁用Aero Glass(即使只有您的应用程序正在使用它)。尝试使用32位颜色。

出于类似原因,可能还有其他设置禁用它。简而言之,仔细检查您正在创建OpenGL的所有设置,并考虑“如果桌面切换到此模式,Aero Glass会关闭吗?”。

答案 2 :(得分:0)

不确定你正在做什么导致了这一点,但它可能也是如此 - 微软在Windows 7中的OpenGL实现并不完美,说得好听。事实上,在我的大多数OpenGL代码中,我都明确地关闭了DWM。否则,微软实施中的错误基本上会阻止它的工作。虽然我可以在某种程度上以其他方式解决问题,但性能却很差,无论如何都会使代码基本上无法使用(我没有做过严格的测量,但我立即猜测我会说至少5:1的性能损失)。

答案 3 :(得分:0)

我曾经在我的应用程序中遇到一个问题,当尝试从窗口DC进行BitBlt时,GDI无法读取OpenGL渲染的窗口内容。当Vista刚刚问世的时候就是这样。使用PFD_SUPPORT_GDI可以解决这个问题,但它也会禁用Aero。我想这个问题已经破坏了很多旧的应用程序,所以他们在某些情况下强迫它开启。不知道你的情况如何。我敢打赌司机存根问题。

我对OpenGL,Aero和GDI的经验有限。