当 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)
我开发了一个 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)