2010-01-29 5 views
7

В моей книге OpenGL, это говорит, что это:FPS как рассчитать это?

«Что часто происходит в такой системе является то, что кадр является слишком сложным рисовать в 1/60 секунды, так что каждый кадр отображается более одного раза. Если, например, для , для рисования кадра требуется 1/45 секунды, вы получаете 30 кадров в секунду, а графики простаивают 1/30 1/45 = 1/90 секунды на кадр или одну треть . время."

В предложении, в котором говорится: «Требуется 1/45 секунды, чтобы нарисовать рамку, вы получите 30 кадров в секунду», почему я получаю только 30 кадров в секунду? Правильнее 45 кадр/с?

+0

жаль, ребята, я еще не понимаю, пожалуйста, дайте мне больше ответов с отличным объяснением! Я действительно не понимаю, почему я получаю только 30 кадров в секунду, и почему это занимает 2/60 секунд, чтобы обновиться! (ссылка anon said), спасибо снова! – drigoSkalWalker

ответ

12

Графическая карта, как правило, будет буферизовать только один кадр вперед.

Если для рисования кадра требуется 1/45 секунды, то на 1/60 второй отметки предыдущий кадр будет отображаться повторно. На отметке 1/45 выполняется следующий кадр - но на карте нет свободного буфера, чтобы начать воспроизведение следующего, поэтому приходится сидеть без дела до 1/30, где он может отправить этот кадр и начать работу на следующем.

Это с включенным VSync - если вы отключите его, вместо того, чтобы получать 30 кадров в секунду и незанятую карточку 1/3 раза, карта начнет перерисовку немедленно, и вместо этого вы получите разрывы экрана.

+1

+1: для ссылки V-sync –

+0

почему это должно подождать до 1/30? спасибо в adavance. – drigoSkalWalker

+0

Потому что это когда следующий кадр отправлен (2/60ths секунды). Если вы отключите VSync, вы избежите ожидания, но затем изображение, которое отправляет карта, будет частью одного кадра и части другого. –

5

Это правильно. Вы получите 45 кадров в секунду, но система замедляет его до 30 кадров в секунду, чтобы добиться плавной частоты кадров на мониторах с частотой 60 Гц (60 повторов в секунду).

Потому что нужно рисовать что-то каждые 1/60 секунды на экране монитора 60 Гц, и не может нарисовать «половину кадра», вы должны сделать предыдущий кадр. Поэтому, если вы 60 раз в секунду, вы когда-то рисуете реальный кадр, и каждые 2 кадра вы рисуете первый, то вы получаете 30 кадров в секунду, несмотря на то, что вы можете управлять 45 кадрами в секунду.

+0

60 раз/сек, не каждые 60 секунд –

+0

@Jeffrey, ах, опечатка исправлена, спасибо –

0

Так что, как говорили другие, это связано с тем, что ваша графика ожидает v-синхронизации до начала генерации следующего кадра.

Это говорит ...

Осторожно, не все мониторы обновления 60 Гц. 60 кадров в секунду против 30 кадров в секунду составляет 70 кадров в секунду против 35 кадров в секунду на дисплее 70 Гц.

Если вы не хотите, чтобы ваша карта ждала v-sync перед началом следующего кадра, но все равно избегайте разрыва, используйте triple буферизацию. Затем графический процессор, а затем пинг-понг, отображает 2 буфера, пока отображается 3-й. Событие v-sync - это то, что запускает своп в «готовый» задний буфер. Это все еще не очень здорово, потому что в итоге вы получаете несколько кадров, которые остаются на экране чаще других: с вашим рендерингом 1/45 рамка будет оставаться на 1/30 секунд, а следующая на 1/60, давая некоторую рывок ,

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

Смежные вопросы