Вопрос

В моей книге OpenGL говорится следующее:

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

В предложении, в котором говорится "для рисования кадра требуется 1/45 секунды, вы получаете 30 кадров в секунду", почему я получаю только 30 кадров в секунду?Разве 45 кадров в секунду не было бы более правильным?

Это было полезно?

Решение

Обычно видеокарта буферизует только на один кадр вперед.

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

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

Другие советы

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

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

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

Тем не менее...

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top