几年前我写了一个免费游戏: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
};
答案 0 :(得分:5)
此问题是由以下所有原因引起的:
我有同样的问题,我测试了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的经验有限。