当 window 不可见时,GLUT 动画会导致 1 个核心的利用率达到 100%

GLUT animation leads to 100% utilization of 1 core when the window is invisible

我开发了一个 Python 程序,它使用 PyOpenGL 和 GLUT 进行 window 管理来显示动画。为了让动画 运行 达到尽可能快的帧率,我设置了

glutIdleFunc(glutPostRedisplay)

如推荐here.

效果很好,我得到了稳定的 60 FPS 并且没有很多 CPU 负载。

但是,一旦 window 被另一个 window 隐藏,一个 CPU 核心就会跳到 100% 利用率。

我怀疑虽然 window 是可见的,但调用 glutDisplayFunc 的速率是有限的,因为它包含一个等待 vsync 的调用 glutSwapBuffers();并且当它不可见时此限制失效。

我试图通过跟踪可见性(通过 glutVisibilityFunc)并将以下代码放在 glutDisplayFunc 的开头来解决问题:

if not visible:
    time.sleep(0.1)
    return

然而这并没有达到预期的效果。

这里发生了什么,我该如何避免?

我找到了解决方案 here, 一旦您知道它就很明显:当 window 变得不可见时,将 glutPostRedisplay 禁用为 glutIdleFunc。具体来说,使用这样的 glutVisibilityFunc

def visibility(state):
    if state == GLUT_VISIBLE:
        glutIdleFunc(glutPostRedisplay)
    else:
        glutIdleFunc(None)