3

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

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

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

我正在使用这个像素格式描述符:

    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

4 回答 4

5

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

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

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

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

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

我发现的一个短期解决方法是创建一个比屏幕分辨率大 1 像素的窗口(在宽度或高度上)

这会欺骗窗口,使其无法检测到您已进入全屏模式并且不会触发问题。

于 2011-09-20T19:13:52.503 回答
1

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

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

于 2010-04-22T12:49:25.003 回答
0

我曾经在我的应用程序中遇到一个问题,即 GDI 在尝试从窗口 DC 执行 BitBlt 时无法读取 OpenGL 渲染的窗口内容。这是Vista刚问世的时候。使用 PFD_SUPPORT_GDI 可以解决这个问题,但它也会禁用 Aero。我猜这个问题让很多旧应用程序崩溃了,所以他们在某些情况下强迫它打开。不知道你的情况是什么。我敢打赌驱动程序存根问题。

只是我自己对 OpenGL、Aero 和 GDI 的有限经验。

于 2012-03-09T10:01:32.173 回答
0

不知道你在做什么会导致这种情况,但它可能也一样——微软在 Windows 7 中的 OpenGL 实现并不完全完美,说得好听点。事实上,在我的大部分 OpenGL 代码中,我已经明确地关闭了 DWM。否则,Microsoft 实现中的错误基本上会使其无法正常工作。虽然我可以通过其他方式在一定程度上解决这个问题,但性能太差了,它使代码基本上无法使用(我没有进行过认真的测量,但立即猜测我会说至少 5:1 的性能损失) .

于 2010-04-20T04:28:15.630 回答