C++ PaintGL()调用理解

C++ PaintGL()调用理解,c++,opengl,C++,Opengl,我知道PaintGL()函数的调用频率与屏幕的调用频率相同(比如每秒60次)。但是,如果屏幕上没有显示像素(如果另一个窗口隐藏了OpenGL),那么对PaintGL()的调用就不再是约束性的,而且被调用的次数要多得多。。。它最大限度地使用CPU,令人讨厌 那么,有没有办法抑制它呢 我正在使用MacOS 10.9和Qt Creator 我对vsync了解不多。事实上,我的软件在上一轮和隐藏时使用了30%的CPU。如果没有启用vsync,则尽可能频繁地交换帧(如果没有添加人工暂停)。若你们在图形卡上

我知道
PaintGL()
函数的调用频率与屏幕的调用频率相同(比如每秒60次)。但是,如果屏幕上没有显示像素(如果另一个窗口隐藏了OpenGL),那么对
PaintGL()
的调用就不再是约束性的,而且被调用的次数要多得多。。。它最大限度地使用CPU,令人讨厌

那么,有没有办法抑制它呢

我正在使用MacOS 10.9和Qt Creator


我对vsync了解不多。事实上,我的软件在上一轮和隐藏时使用了30%的CPU。如果没有启用vsync,则尽可能频繁地交换帧(如果没有添加人工暂停)。若你们在图形卡上推高负载,很可能你们的程序是GPU有限的(CPU无所事事,闲置等待GPU完成绘图)

当您的程序不可见时,绘图成本几乎为零,因为没有人会看到结果(由图形驱动程序内部执行优化)


所以,您的问题的答案是-启用vsync。它会将缓冲区交换间隔锁定为监视器的刷新率,因此您的帧速率将永远不会高于刷新率(事实上,如果您的监视器为60 Hz,它将锁定为数字60/30/20/等)。这是一种非常有用的技术,例如消除屏幕撕裂。

您是说启用vsync后,您的背景窗口不再被vsync锁定?什么操作系统/图形驱动程序/等等。?您确定vsync已启用吗?您确定在这种情况下调用您的
PaintGL()
的频率确实更高吗?我不知道Qt的内部结构,但通常它根本不应该被调用,当你的窗口被隐藏时,我如何启用vsync?它依赖于平台。如果您使用Qt的GL初始化,请尝试。VSYNC对于消除屏幕撕裂不再特别有用(在窗口应用程序中)。OS X和Windows现在都使用合成窗口管理器,您可以在不使用VSYNC的情况下全速(例如12000 FPS)交换缓冲区,而窗口管理器本身将通过仅以适当的VBLANK间隔更新窗口来防止撕裂。在渲染速度快于显示器显示图像速度的应用程序上,它有助于限制CPU/GPU的利用率。@AndonM.Coleman不知道OSX,但在windows(从vista开始)上,无论我做什么,我仍然会看到撕裂,除非在真正的全屏模式下启用或禁用vsync。我不知道8 tho的情况,我记得他们删除了aero,也许现在情况更好了。从未在linux上使用过合成WM,因此从未在那里看到过撕裂(我的主环境)。但无论如何,从vsync工作原理的核心技术来看,我怀疑WM是否能将任意帧速率映射到屏幕刷新(而windows航空部分证实了这一点)。@keltar:应该是另一种方式。合成窗口管理器时不需要VSYNC,因为它们可以使用最后一个完全交换的前缓冲区映像的副本(消除在VBLANK间隔之前未完成的交换问题)。交换缓冲区时,帧缓冲区不会像以前那样直接进入显示器。。。窗口管理器将窗口作为单独的绘制过程绘制。事实上,在Microsoft Windows上,在调度GPU时,DWM在所有应用程序中具有最高优先级。