Как я могу реализовать точное (но переменное) ограничение / ограничение FPS в моем приложении OpenGL?

В настоящее время я работаю над приложением OpenGL для отображения пользователю нескольких трехмерных сфер, которые они могут вращать, перемещать, При этом здесь нет особой сложности, поэтому приложение работает с довольно высокой частотой кадров (~ 500 FPS).

Очевидно, это перебор - даже 120 было бы более чем достаточно, но мой проблема в том, что запуск приложения с полной статистикой съедает мой процессор, вызывая избыточное тепло, энергопотребление и т. д. Я хочу позволить пользователю установить ограничение FPS, чтобы процессор не использовался чрезмерно. когда это не нужно.

Я работаю с freeglut и C ++, и уже настроил обработку анимации / событий для использования таймеров (используя glutTimerFunc ). Однако glutTimerFunc позволяет устанавливать только целое количество миллисекунд, поэтому, если я хочу 120 кадров в секунду, самое близкое, что я могу получить, это (int) 1000/120 = 8 мс разрешение, равное 125 FPS (я знаю, что это ничтожное количество, но я все же хочу установить предел FPS и получить именно этот FPS, если я знаю, что система может рендерить быстрее).

Кроме того, используя glutTimerFunc для ограничения FPS никогда не работает стабильно. Допустим, я ограничиваю свое приложение 100 FPS, обычно оно никогда не превышает 90-95 FPS. Опять же, я попытался определить разницу во времени между рендерингом / вычислениями, но затем он всегда превышал предел на 5-10 кадров в секунду (возможно, разрешение таймера).

Я полагаю, что лучшим сравнением здесь будет игра (например, Half Life 2) - вы устанавливаете лимит FPS, и он всегда достигает именно этого количества. Я знаю, что могу измерить разницу во времени до и после рендеринга каждого кадра, а затем зацикливаться, пока мне не понадобится нарисовать следующий, но это не решает мою проблему 100% использования ЦП и не решает проблему разрешения времени.

​​Можно ли как-нибудь реализовать в моем приложении эффективный кроссплатформенный ограничитель / ограничение частоты кадров? Или, по-другому, есть ли какая-нибудь кроссплатформенная (и с открытым исходным кодом) библиотека, которая реализует таймеры с высоким разрешением и функции сна?

Изменить: Я бы предпочел найти решение, которое не зависит от включения VSync конечным пользователем. , поскольку я собираюсь позволить им указать ограничение FPS.

Редактировать № 2: Всем, кто рекомендует SDL (который я в конечном итоге портировал свое приложение на SDL ), есть ли какие-нибудь разница между использованием функции glutTimerFunc для запуска розыгрыша или использованием SDL_Delay для ожидания между розыгрышами? В документации для каждого из них упоминаются одни и те же предостережения, но я не был уверен, было ли одно более или менее эффективным, чем другое.

Редактировать № 3: В основном, я пытаюсь выяснить, есть ли (простой способ ), чтобы реализовать точный ограничитель FPS в моем приложении (опять же, как Half Life 2). Если это невозможно, я, скорее всего, переключусь на SDL (для меня больше смысла использовать функцию задержки, чем использовать glutTimerFunc для вызова функции рендеринга каждые x миллисекунд). .

9
задан Breakthrough 10 June 2013 в 17:26
поделиться