gpt4 book ai didi

windows - Vista/7 的 OpenGL 最多 32 个屏幕窗口

转载 作者:可可西里 更新时间:2023-11-01 13:13:53 27 4
gpt4 key购买 nike

在我将其简化为一个合理的示例之前,我希望有人之前可能遇到过这个问题并且可以阐明这个问题。

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

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

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

如果我释放屏幕上的上下文/窗口,则非工作窗口将再次开始工作。就好像 Vista/7 在屏幕上显示 32 个窗口后就停止显示 OpenGL 渲染一样。

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

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

最佳答案

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

我自己进行了一些测试,结果表明 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? 非常相似

关于windows - Vista/7 的 OpenGL 最多 32 个屏幕窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8775392/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com