我开发了一个Python程序,该程序使用PyOpenGL和GLUT进行窗口管理以显示动画。为了使动画以最快的帧速率运行,我设置了
glutIdleFunc(glutPostRedisplay)
根据建议,例如here。
效果很好,我得到了稳定的60 FPS,CPU负载也不大。
但是,一旦该窗口被另一个窗口隐藏,一个CPU内核就会跳至100%利用率。
我怀疑在窗口可见时,glutDisplayFunc
的调用速率是有限的,因为它包含一个等待glutSwapBuffers()
并等待vsync的调用。并且该限制在不可见时会失效。
我试图通过跟踪可见性(通过glutVisibilityFunc
)并将以下代码放在glutDisplayFunc
的开头来解决该问题:
if not visible:
time.sleep(0.1)
return
但是,效果不理想。
这里发生了什么,如何避免呢?
答案 0 :(得分:0)
我找到了解决方法here,
一旦知道,就很明显:当窗口不可见时,将glutPostRedisplay
禁用为glutIdleFunc
。具体来说,像这样使用glutVisibilityFunc
:
def visibility(state):
if state == GLUT_VISIBLE:
glutIdleFunc(glutPostRedisplay)
else:
glutIdleFunc(None)