Chr*_*oyd 7 windows opengl winapi windows-xp windows-vista
在我将其简化为一个合理的例子之前,我希望有人可能会遇到这个问题并且可以解决这个问题.
我有一个基于32位C的应用程序,每个窗口使用一个OpenGL上下文,所有上下文和窗口都设置相同.请求的像素格式是32位颜色,alpha,深度缓冲,加速.在Windows 2000和XP上,一切都运行良好.
一切都在Vista和7上完美运行,直到创建了第33个窗口/上下文对.创建窗口没有错误,创建上下文没有错误,使上下文当前没有错误,绘图不产生错误,SwapBuffers不会产生错误.但是,OpenGL上下文无法产生任何输出,Aero的窗口是白色的,它们没有绘制经典模式,只是屏幕垃圾.杀死DWM并不能解决问题,尝试不同的像素格式(单缓冲区,差异深度等)和PFD_SUPPORT_COMPOSITION不能解决问题.这是在许多不同的机器上使用Vista/7,而不是XP.
我可以glReadPixels后面的缓冲区,它们是正确的像素.渲染到具有相同上下文的pbuffer工作正常,渲染到> 32 pbuffers是好的.
如果我在屏幕上下文/窗口中自由工作,那么非工作窗口将再次开始工作.这就好像Vista/7只是在屏幕上显示32个窗口后停止显示OpenGL渲染.
如果像素格式描述符包括PFD_SUPPORT_GDI,则一切正常,但它使用的软件渲染器是不可接受的.
我想知道这是Vista/7中的OS限制或驱动程序限制.感谢您的任何见解.
该限制是特定于实现的,您所能做的就是在通用硬件上运行一些测试。
我自己进行了一些测试,结果发现 GeForce 卡的限制相当高(甚至可能没有限制)。对于桌面版 Quadro,能够正确重绘的上下文有 128 个限制,该程序能够创建 128 个以上上下文而不会出现错误,但窗口包含垃圾。我没有使用 PFD_SUPPORT_GDI。
在 ATi Radeon 6950 上更有趣,重绘在窗口 #105 处停止,并且创建渲染上下文 #200 失败。
如果您想亲自尝试,可以在这里找到该程序:Max OpenGL Contexts test(有完整的源代码+ win32 二进制文件)。也许你可以查看代码并找出罪魁祸首,听到它会很感兴趣。
这就是结果。一条建议 - 尽可能避免使用多个上下文。在多个监视器上运行的应用程序中可以理解多个上下文,但单个监视器上的应用程序应诉诸单个上下文。上下文切换很慢。这还不是全部。OpenGL 窗口与另一个窗口重叠的应用程序需要硬件剪切区域。GeForce 上有 1 个硬件剪切区域,Quadro 上有 8 个或更多(CAD 应用程序通常使用与 OpenGL 窗口重叠的窗口和菜单,与游戏不同)。如果需要更多区域,渲染将退回到软件 - 同样如此 - 拥有大量 OpenGL 窗口(上下文)并不是一个好主意。
请注意,这与您可以同时创建的 OpenGL 渲染上下文数量是否有限制?