OpenGL: Как минимизировать отрисовку?

Мой экран OpenGL состоит из 2 треугольников и 1 текстуры, больше ничего. Я хотел бы обновлять экран как можно реже, чтобы экономить энергию и ограничивать использование ЦП/ГП. К сожалению, когда моя подпрограмма draw_scene возвращается досрочно, ничего не рисуя, экран OpenGL становится черным, даже если я никогда не вызываю glutSwapBuffers. Кстати, мой фон не черный. Кажется, что если я не рисую, окно OpenGL теряет свое содержимое. Как я могу свести к минимуму количество рисунков, которые выполняются?


person popoe    schedule 02.12.2018    source источник
comment
Приведите минимальный пример кода, воспроизводящий проблему, пожалуйста.   -  person Sergey    schedule 02.12.2018


Ответы (1)


Современные графические системы предполагают, что при запуске перерисовки перерисовывается все содержимое. Кроме того, если вы получаете событие перерисовки от графической системы, то обычно это происходит из-за того, что содержимое окна стало неопределенным и его необходимо создать заново, поэтому в такой ситуации вы должны перерисовать.

Чтобы сэкономить энергию, вы должны отключить цикл простоя (или просто передать все, что он делает, и немедленно вернуться к планировщику ОС) и не создавать таймеры для создания событий.

person datenwolf    schedule 02.12.2018
comment
Привет, звучит примерно так. Что касается цикла простоя, вы просто имеете в виду обратный вызов бездействия GLUT? Я вызываю glutMainLoop и устанавливаю обратный вызов бездействия, но я ничего не делаю в обратном вызове бездействия. - person popoe; 03.12.2018
comment
@popoe: Если вы используете GLUT, то да, я имею в виду обратный вызов бездействия. Вы можете отключить обратный вызов бездействия в любое время, передав нулевой указатель на glutIdleFunc. А можно просто уступить ОС в функции холостого хода. Вызовите sched_yield в системах POSIX, в Windows эквивалентная функция — SwitchToThread. - person datenwolf; 03.12.2018
comment
Не будет ли функция бездействия также хорошим местом для вставки вызова usleep, чтобы убедиться, что FPS не слишком высок? В настоящее время я вижу более 200 кадров в секунду, когда нет функции ожидания и не требуется обновление текстуры. - person popoe; 04.12.2018
comment
@popoe: функция ожидания вызывается только тогда, когда нет ожидающих событий. Если у вас есть постоянные перерисовки, вы безоговорочно вызываете glutPostRedisplay либо в конце каждой перерисовки, либо внутри функции ожидания. Спящий режим можно использовать для ограничения частоты кадров, но лучше использовать таймер с высоким разрешением для ограничения повторного отображения (т. е. не вызывать glutPostRedisplay, если с момента последней перерисовки прошло недостаточно времени). - person datenwolf; 04.12.2018