установка максимального количества кадров в секунду в openGL

Есть ли способ рассчитать, сколько обновлений нужно сделать, чтобы достичь желаемой частоты кадров, а не конкретной системы? Я обнаружил, что для Windows, но я хотел бы знать, существует ли что-то подобное в самом OpenGL. Это должен быть какой-то таймер.

Или как еще можно предотвратить резкое падение или повышение FPS? На этот раз я тестирую его, рисуя большое количество вершин в строке, и используя фрапс, я вижу, как частота кадров увеличивается от 400 до 200 кадров в секунду с явным замедлением рисования.

8
задан deft_code 20 July 2010 в 22:58
поделиться

4 ответа

У вас есть два разных способа решить эту проблему:

  1. Предположим, у вас есть переменная с именем maximum_fps , которая содержит максимальное количество кадров, которые вы хотите отобразить. .

    Затем вы измеряете количество времени, потраченное на последний кадр (таймер подойдет).

    Теперь предположим, что вы сказали, что хотите, чтобы в вашем приложении была максимальная скорость 60 кадров в секунду. Тогда вы хотите, чтобы измеренное время было не ниже 1/60. Если измеренное время на s меньше, вы вызываете sleep () , чтобы достичь количества времени, оставшегося для кадра.

  2. Или у вас может быть переменная с именем tick , которая содержит текущее «игровое время» приложения. Используя тот же таймер, вы будете увеличивать его в каждом основном цикле вашего приложения. Затем в ваших процедурах рисования вы вычисляете позиции на основе тика var, поскольку он содержит текущее время приложения.

    Большим преимуществом варианта 2 является то, что ваше приложение будет намного проще отлаживать, поскольку вы можете поиграть с переменной tick , перемещаться вперед и назад во времени всякий раз, когда вы хотеть. Это большой плюс.

11
ответ дан 5 December 2019 в 06:22
поделиться

Правило №1. Не заставляйте функции update () или loop () зависеть от того, как часто они вызываются.

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

Обычный способ решения этой проблемы - использовать время, прошедшее с предыдущего обновления. Например,

// Bad
void enemy::update()
{
  position.x += 10; // this enemy moving speed is totally up to FPS and you can't control it.
}

// Good
void enemy::update(elapsedTime)
{
  position.x += speedX * elapsedTime; // Now, you can control its speedX and it doesn't matter how often it gets called.
}
11
ответ дан 5 December 2019 в 06:22
поделиться

Есть ли способ вычислить, сколько обновлений необходимо сделать для достижения желаемой частоты кадров, НЕ зависящей от системы?

Нет.

Невозможно точно рассчитать, сколько обновлений необходимо вызвать для достижения желаемой частоты кадров.

Однако вы можете измерить, сколько времени прошло с момента последнего кадра, рассчитать текущую частоту кадров в соответствии с ним, сравнить его с желаемой частотой кадров, а затем ввести бит Sleep , чтобы снизить текущую частоту кадров до желаемого. ценность. Не точное решение, но сработает.

Я нашел это для Windows, но хотел бы знать, существует ли что-то подобное в самом openGL. Это должен быть какой-то таймер.

OpenGL занимается только рендерингом и не имеет ничего общего с таймерами. Кроме того, использование таймеров Windows - не лучшая идея. Используйте QueryPerformanceCounter, GetTickCount или SDL_GetTicks, чтобы измерить, сколько времени прошло, и спите, чтобы достичь желаемой частоты кадров.

Или как еще я могу предотвратить резкое падение или повышение FPS?

Вы предотвращаете рост FPS во сне.

Что касается предотвращения падения FPS ...

Это безумно обширная тема. Посмотрим.Это выглядит примерно так: используйте объекты буфера вершин или списки отображения, приложение профиля , не используйте безумно большие текстуры, не используйте слишком много альфа-смешивания, избегайте "RAW" OpenGL (glVertex3f), не используйте рендеринг невидимых объектов (даже если полигоны не рисуются, их обработка требует времени), рассмотрите возможность изучения BSP или OCTree для рендеринга сложных сцен в параметрических поверхностях и кривых, не используйте без необходимости слишком много примитивов (если вы визуализируете круг используя миллион полигонов, разницы никто не заметит), отключите vsync. Вкратце - уменьшите до абсолютно возможного минимума количество вызовов рендеринга, количество визуализированных полигонов, количество визуализированных пикселей, количество прочитанных текселей, прочтите всю доступную документацию по производительности от NVidia, и вы должны получить прирост производительности.

3
ответ дан 5 December 2019 в 06:22
поделиться

Вы задаете неправильный вопрос. Ваш монитор будет отображать только 60 кадров в секунду (50 кадров в секунду в Европе, или, возможно, 75 кадров в секунду, если вы про-геймер).

Вместо этого вы должны стремиться зафиксировать fps на 60 или 30. Существуют расширения OpenGL, которые позволяют это сделать. Однако эти расширения не являются кроссплатформенными (к счастью, они не зависят от видеокарты, иначе это было бы очень страшно).

Эти расширения тесно связаны с v-sync вашего монитора. После включения вызовы подкачки бэк-буфера OpenGL будут блокироваться до тех пор, пока монитор не будет готов к этому. Это все равно, что в коде поставить sleep для обеспечения 60 кадров в секунду (или 30, или 15, или какое-то другое число, если вы не используете монитор с частотой 60 Гц). Разница в том, что "sleep" всегда идеально рассчитан по времени, а не основан на обоснованном предположении о том, сколько времени занял последний кадр.

0
ответ дан 5 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: