Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 我的OpenGL游戏关闭Aero DWM玻璃_Windows_Opengl_Aero_Aero Glass_Dwm - Fatal编程技术网

Windows 我的OpenGL游戏关闭Aero DWM玻璃

Windows 我的OpenGL游戏关闭Aero DWM玻璃,windows,opengl,aero,aero-glass,dwm,Windows,Opengl,Aero,Aero Glass,Dwm,几年前我写了一个免费游戏:。对于大厅和菜单,它使用普通对话框,如win32。当实际游戏开始时,它使用OpenGL 现在,在Windows7上,当实际游戏开始时,它会关闭Windows aero glass,并在游戏结束时重新打开它 我能做些什么来防止这种情况发生吗?如果玻璃开着,一些特殊的旗子可以让它保持开启状态?(对于较新版本,我一直在使用DirectX,但这种情况在那里没有发生。)也许我必须在某个地方指定一些(新)标志 我正在使用这个像素格式描述符: static PIXELFORM

几年前我写了一个免费游戏:。对于大厅和菜单,它使用普通对话框,如win32。当实际游戏开始时,它使用OpenGL

现在,在Windows7上,当实际游戏开始时,它会关闭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
    };

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

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


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

此问题是由以下所有原因造成的:

  • 视窗7
  • OpenGL
  • 创建与屏幕矩形完全匹配的窗口(全屏)
  • 第二次调用交换缓冲区
  • 旧图形卡驱动程序
我也有同样的问题,我测试了2个使用OpenGL的AAA游戏引擎,可以确认它们都有同样的问题。DirectX似乎没有受到影响

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

我建议您更新图形卡驱动程序以解决此问题

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


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

我曾经在应用程序中遇到一个问题,即GDI在尝试从窗口DC执行BitBlt时无法读取OpenGL渲染的窗口内容。这是Vista刚推出的时候。使用PFD_SUPPORT_GDI可以解决这个问题,但也会禁用Aero。我猜这个问题导致很多旧的应用程序被破坏,所以在某些情况下他们强迫它打开。不确定你的情况。我会赌一个司机存根问题


仅凭我对OpenGL、Aero和GDI的有限经验。

是全屏应用程序还是窗口应用程序?对于一个全屏应用程序,你不应该太在意,而对于一个窗口应用程序,DirectX行为不同的原因是DWM本身使用的是DirectX,而不是OpenGL。它是全屏的,但不需要硬件。因此,如果将其切换到窗口应用程序,则可以修复它。我会的。但我不知道怎么做。顺便说一句,我发现了这个网站:上面有一些opengl的例子。它们来自2005年和窗口模式,16位,但dwm保持打开状态。但是,他们使用sdl初始化opengl曲面:/哈,哦,好吧。那个游戏太老了,我完全忘了我用16位初始化OpenGL。你是对的,这就是原因。我将尝试修改它并报告。不,我将16位更改为32或24位,效果仍然相同。这通常是不可能的吗?我在上面的问题中添加了我使用的Pixelformatdescriptor。