Какой обычный способ контроля частоты кадров? - PullRequest
13 голосов
/ 01 апреля 2011

Я новичок в графике, поэтому я не знаю, как люди обычно контролируют частоту кадров при рендеринге. Я имею в виду, как вы можете настроить приложение для рендеринга, скажем, со скоростью 30 кадров в секунду? Вероятно, есть много API, которые предлагают такую ​​вещь, но мне нужно кодировать это с нуля.

Ответы [ 2 ]

20 голосов
/ 01 апреля 2011

Существует два "обычных" способа "контролировать" частоту кадров, и ни один не так прост.

Первым и более контролирующим из двух, и что-то, что обычно является необязательным, является VSync. Это заставляет видеокарту выдвигать новый кадр только после обновления монитора. Многие мониторы обновляются с частотой 60 Гц, поэтому вы, как правило, получаете 60 кадров в секунду.

Это очень хорошо работает для cap частоты кадров для отслеживания частоты обновления, но когда частота кадров падает ниже частоты обновления, это приводит к следующему кратному. Таким образом, когда частота кадров начинает немного падать, вы теряете немного потенциального времени рендеринга, потому что оно равно 60, затем 30, затем 20 и т. Д.

(немного информации о vsync в DirectX и OpenGL )

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

Предполагая, что у вас есть простой цикл рендеринга, он начинает выглядеть примерно так:

while ( gameloop )
{
    float framedelta = ( timeNow - timeLast )
    timeLast = timeNow;

    for each ( GameObject object in World )
    {
        object->Animate(framedelta);
        object->Move(speed * framedelta)
    }

    render();
}

Вы хотите посмотреть разницу во времени / прошедшее время / дельта и работать оттуда. Разрешите масштабировать частоту кадров в зависимости от оборудования и настроек (слишком много вариантов, чтобы вы могли предсказать или обработать даже половину), и заставить вашу игру работать с этим вместо того, чтобы управлять им. Намного проще, гибче и стабильнее на практике.

6 голосов
/ 01 апреля 2011

Типичный способ получения предсказуемой (если не постоянной) частоты кадров (с видео или 3D-графикой) описан в следующем псевдокоде.

Алгоритм

  1. Подготовка следующего кадра (рендеринг в обратном буфере);
  2. Спящий режим для оставшейся части временного интервала;
  3. Задание отображения кадра(поменяйте местами передний и задний буферы).

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

Существует несколько вариантов реализации каждого из этих шагов (выбор операции ожидания на основе ееразрешение, надежность и т. д.), но ядро ​​есть.

Советы по повышению надежности

  • Не вызывайте функцию сна один раз для всегоинтервал.Определите некоторую константу с максимальной ошибкой, которую вы готовы принять, и несколько раз переходите в спящий режим в течение периодов этого интервала, пока оставшееся время не станет меньше или равно этой величине.
  • Не бойтесь иногда отбрасывать кадр, когдаВы знаете, что не сможете подготовить следующий кадр вовремя.Визуально более привлекательным является пропуск кадра, чем создание переменной частоты кадров.
  • Если вы можете избежать фоновых потоков в однопроцессорной системе, избегайте их.Использование рабочих потоков действительно испортит надежность вашей функции сна.Наилучший подход - разбить фоновую работу на небольшие куски и выполнять эту работу вместо сна.

1-й прост в реализации и может быть скрыт в вспомогательной функции.Второе немного более обидно, поскольку, помимо всего прочего, вам необходимо вести статистику средней скорости рендеринга.Третий трудно реализовать, так как зачастую сложно предсказать, сколько времени займет выполнение различных задач.Обычно он применяется только в системах реального времени с жесткими ограничениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...