Search code examples
glutpyopengl

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


I developed a Python program that uses PyOpenGL and GLUT for window management to show an animation. In order to have the animation run at the fastest possible framerate, I set

glutIdleFunc(glutPostRedisplay)

as recommended e.g. here.

That works well, I get a steady 60 FPS with not a lot of CPU load.

However, as soon as the window is hidden by another window, one CPU core jumps to 100% utilization.

My suspicion is that while the window is visible, the rate at which the glutDisplayFunc is called is limited, because it contains a call glutSwapBuffers() which waits for vsync; and that this limitation fails when it is invisible.

I tried to solve the problem by keeping track of visibility (through a glutVisibilityFunc) and putting the following code at the beginning of my glutDisplayFunc:

if not visible:
    time.sleep(0.1)
    return

This does not however have the desired effect.

What's happening here, and how do I avoid it?


Solution

  • I found the solution here, and it is obvious once you know it: Disable the glutPostRedisplay as glutIdleFunc when the window becomes invisible. Concretely, use a glutVisibilityFunc like this:

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