В настоящее время я работаю над приложением OpenGL для отображения пользователю нескольких трехмерных сфер, которые они могут вращать, перемещать и т. Д. При этом сложность здесь невелика, поэтому приложение работает надовольно высокая частота кадров (~ 500 кадров в секунду).
Очевидно, это излишне - даже 120 будет более чем достаточно, но моя проблема в том, что при запуске приложения с полной статистикой расходуется мой ЦП, что вызывает чрезмерное нагревание, энергопотребление и т. д. Я хочу позволить пользователю установить ограничение FPS, чтобы процессор не использовался чрезмерно, когда в этом нет необходимости.
Яработая с freeglut и C ++, и уже настроил обработку анимаций / событий для использования таймеров (используя glutTimerFunc
).glutTimerFunc
, однако, позволяет устанавливать целое количество миллисекунд - поэтому, если я хочу 120 FPS, самое близкое, что я могу получить, это разрешение (int)1000/120 = 8 ms
, что равно 125 FPS (я знаю, что это незначительное количество, ноЯ все еще просто хочу установить предел FPS и получить именно тот FPS, если я знаю, что система может рендериться быстрее.
Более того, использование glutTimerFunc
для ограничения FPS никогда не работает согласованно.Допустим, я ограничил свое приложение до 100 FPS, обычно оно никогда не поднималось выше 90-95 FPS.Опять же, я попытался выяснить разницу во времени между рендерингом / вычислениями, но затем он всегда превышает предел на 5-10 кадров в секунду (возможно, разрешение по таймеру).
Полагаю, лучшее сравнение здесь будетигра (например, Half Life 2) - вы устанавливаете свой предел FPS, и он всегда достигает именно этой суммы.Я знаю, что могу измерить дельты времени до и после рендеринга каждого кадра, а затем выполнить цикл, пока мне не понадобится рисовать следующий, но это не решает проблему 100% использования ЦП и не решает проблему разрешения времени.
Можно ли как-нибудь реализовать эффективный кроссплатформенный ограничитель / ограничение частоты кадров в моем приложении?Или, по-другому, есть ли кроссплатформенная (и с открытым исходным кодом) библиотека, которая реализует таймеры высокого разрешения и функции сна?
Редактировать: Я бы предпочел найти решение, которое не зависит от концапользователь, включающий VSync, так как я собираюсь позволить им указать ограничение FPS.
Edit # 2: Всем, кто рекомендует SDL (что я в итоге портировал свое приложение наSDL ), есть ли разница между использованием функции glutTimerFunc
для запуска розыгрыша или SDL_Delay
для ожидания между розыгрышами?В документации каждого из них упоминаются одни и те же предостережения, но я не был уверен, был ли один более или менее эффективным, чем другой.
Правка № 3: По сути, я пытаюсь выяснить, есть ли(простой способ) реализовать точный ограничитель FPS в моем приложении (опять же, как Half Life 2).Если это невозможно, я, скорее всего, переключусь на SDL (для меня более разумно использовать функцию задержки, а не использовать glutTimerFunc
для вызова функции рендеринга каждые x
миллисекунд).