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

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


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


Ответы (1)


arrow_upward
1
arrow_downward

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

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

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