使用 Vista/7 的 OpenGL 最多 32 个屏幕窗口

Posted

技术标签:

【中文标题】使用 Vista/7 的 OpenGL 最多 32 个屏幕窗口【英文标题】:OpenGL maximum of 32 on-screen windows with Vista/7 【发布时间】:2012-02-05 05:15:07 【问题描述】:

在我把它简化为一个合理的例子之前,我希望有人可能曾经遇到过这个问题并能对这个问题有所了解。

我有一个基于 32 位 C 的应用程序,每个窗口使用一个 OpenGL 上下文,所有上下文和窗口都设置相同。请求的像素格式是 32 位颜色、alpha、深度缓冲区、加速。在 Windows 2000 和 XP 上一切正常。

在创建第 33 个窗口/上下文对之前,在 Vista 和 7 上一切正常。创建窗口没有错误,创建上下文没有错误,使上下文成为当前没有错误,绘图没有错误,SwapBuffers 没有错误。但是,OpenGL 上下文无法产生任何输出,使用 Aero 的窗口是白色的,在经典模式下它们不绘制并且只是屏幕垃圾。杀死 DWM 并不能解决问题,尝试不同的像素格式(单缓冲区、差异深度等)和 PFD_SUPPORT_COMPOSITION 并不能解决问题。这是在许多装有 Vista/7 的不同机器上,而不是 XP。

我可以 glReadPixels 后台缓冲区,它们是正确的像素。渲染到具有相同上下文的 pbuffer 可以正常工作,渲染到 >32 个 pbuffer 就可以了。

如果我释放屏幕上下文/窗口,非工作窗口将重新开始工作。就好像 Vista/7 只是在屏幕上显示 32 个窗口后停止显示 OpenGL 渲染。

如果像素格式描述符包含 PFD​​_SUPPORT_GDI 一切正常,但它使用的是软件渲染器,这是不可接受的。

我想知道这是否是 Vista/7 中的操作系统限制或驱动程序限制。感谢您提供任何见解。

【问题讨论】:

如果您创建 33 个窗口附加到相同的唯一上下文,会有什么行为? 我怀疑这是一个特定的驱动程序实现,这是罪魁祸首。您是否在多个卡/制造商中看到相同的行为? 【参考方案1】:

限制是特定于实现的,您所能做的就是在通用硬件上运行一些测试。

我自己进行了一些测试,结果发现 GeForce 卡的限制相当高(甚至可能没有限制)。对于桌面 Quadro,有 128 个能够正确重绘的上下文的限制,该程序能够再创建 128 个没有错误的上下文,但窗口包含垃圾。我没有使用 PFD_SUPPORT_GDI。

在 ATi Radeon 6950 上更有趣,重绘在窗口 #105 处停止,创建渲染上下文 #200 失败。

如果您想自己尝试,可以在这里找到该程序:Max OpenGL Contexts test(有完整的源代码 + win32 二进制文件)。也许您可以查看代码并追踪罪魁祸首,您会很感兴趣。

结果就是这样。一条建议 - 尽可能避免使用多个上下文。在多个监视器上运行的应用程序可以理解多个上下文,但单个监视器上的应用程序应该求助于单个上下文。上下文切换很慢。这还不是全部。 OpenGL 窗口与另一个窗口重叠的应用程序需要硬件裁剪区域。 GeForce 上有一个硬件剪辑区域,Quadro 上有八个或更多(与游戏相比,CAD 应用程序通常使用与 OpenGL 窗口重叠的窗口和菜单)。如果需要更多区域,则渲染会退回到软件——同样如此——拥有大量 OpenGL 窗口(上下文)并不是一个好主意。

请注意,这与Is there a limit to how many OpenGL rendering contexts you can create simultaneously? 非常相似

【讨论】:

以上是关于使用 Vista/7 的 OpenGL 最多 32 个屏幕窗口的主要内容,如果未能解决你的问题,请参考以下文章

Vista / 7下的本机提示/工具提示与Delphi 7?

如何制作与 Vista/7 和 XP 兼容的图标?

制作Vista/7 User Frame 控件? (WinAPI)

Vista/7 UAC:如何降低进程权限

在 Windows Vista/7 中重定向应用程序的图形输出(使用 DWM)

如何使用 Delphi 在控制台应用程序中激活玻璃效果(Windows Vista/7)