关于pyopengl:当窗口不可见时,GLUT动画会导致1个核心的100%利用率

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

我开发了一个Python程序,该程序使用PyOpenGL和GLUT进行窗口管理以显示动画。为了使动画以最快的帧速率运行,我设置了

1
glutIdleFunc(glutPostRedisplay)

根据建议,例如在这里。

效果很好,我得到了稳定的60 FPS,CPU负载也很少。

但是,一旦该窗口被另一个窗口隐藏,一个CPU内核就会跳至100%的利用率。

我怀疑在窗口可见时,glutDisplayFunc的调用速率是有限的,因为它包含等待vsync的调用glutSwapBuffers();并且该限制在不可见时失败。

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

1
2
3
if not visible:
    time.sleep(0.1)
    return

但是,此效果不理想。

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


我在这里找到了解决方案,
一旦知道,就很明显:当窗口不可见时,将glutPostRedisplay禁用为glutIdleFunc。具体来说,像这样使用glutVisibilityFunc

1
2
3
4
5
def visibility(state):
    if state == GLUT_VISIBLE:
        glutIdleFunc(glutPostRedisplay)
    else:
        glutIdleFunc(None)