GLUT анимация приводит к 100% использованию 1 ядра, когда окно невидимо - PullRequest
0 голосов
/ 11 мая 2019

Я разработал программу на Python, которая использует PyOpenGL и GLUT для управления окнами, чтобы показать анимацию.Чтобы анимация работала с максимально возможной частотой кадров, я установил

glutIdleFunc(glutPostRedisplay)

в соответствии с рекомендациями, например, здесь .

Это хорошо работает, я получаю устойчивое значение 60FPS с небольшой загрузкой ЦП.

Однако, как только окно скрывается другим окном, одно ядро ​​ЦП переходит на 100%.

Я подозреваю, что пока окновидно, что скорость, с которой вызывается glutDisplayFunc, ограничена, поскольку она содержит вызов glutSwapBuffers(), который ожидает vsync;и что это ограничение не срабатывает, когда оно невидимо.

Я пытался решить проблему, отслеживая видимость (через glutVisibilityFunc) и помещая следующий код в начало моего glutDisplayFunc:

if not visible:
    time.sleep(0.1)
    return

Однако это не дает желаемого эффекта.

Что здесь происходит, и как мне этого избежать?

1 Ответ

0 голосов
/ 11 мая 2019

Я нашел решение здесь , и, как только вы его узнаете, становится очевидным: отключите glutPostRedisplay как glutIdleFunc, когда окно станет невидимым.Конкретно, используйте glutVisibilityFunc вот так:

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