Двойная буферизация OpenGL при скорости более 60 кадров в секунду

Как приложение OpenGL с двойной буферизацией достигает более 60 кадров в секунду (ограничение обновления дисплея)?
Зависит ли это от реализации драйвера, а именно от того, использует ли он двойную или тройную буферизацию?

Рассмотрим следующий основной цикл приложения:

while (1) {
  draw_scene();
  swap_buffers(); 
}

Второе утверждение в цикле является обязательным, если я не использую какую-то необычную синхронизацию с display vsync и не хочу разрываться при отображении изображений. С таким циклом мой fps коррелирует с реализацией драйвера: при двойной буферизации конвейер останавливается, и я архивирую около 60 fps, в то время как при тройной буферизации не происходит останова, и мой fps зависит только от пропускной способности моей видеокарты. Поэтому, если есть необходимость архивировать приложение opengl с высокой частотой кадров / сек, у меня должна быть реализация тройной буферизации внутри приложения. Я прав?

1 ответ

Как приложение OpenGL с двойной буферизацией архива более 60 к / с (ограничение отображения обновления)?

Отключить синхронизацию с дисплеем вертикального отката.

с двойной буферизацией конвейер остановится, и я заархивирую около 60 кадров в секунду, в то время как при тройной буферизации остановка не произойдет, и моя частота кадров зависит только от пропускной способности моей видеокарты.

Единственная разница между двойной и тройной буферизацией - это количество кадров "в очереди" для отображения. Эффективно это добавляет еще один кадр задержки. Однако общая частота кадров не увеличивается. Также нет особого смысла в том, что он пытается рендерить больше кадров в секунду, чем может обработать устройство отображения.

Обмен буфером не останавливает конвейер! Задержка конвейера означает, что некоторая операция внутри конвейера вынуждает устройство очищать весь конвейер и должна воспроизводить значительное количество операций, тем самым снижая общую пропускную способность. Обмен буфером, однако, является точкой синхронизации, что означает, что он ожидает завершения конвейера. Это на самом деле желательно, потому что это дает вашему графическому процессору и драйверам некоторое время, чтобы заняться другими делами, такими как очистка памяти, помеченной для освобождения, и тому подобное. Длительность блоков SwapBuffers также полезна для процесса ваших программ, так как это дает другим потокам времени ЦП вашей программы, которые могут использоваться для обработки ввода пользователя, ввода-вывода, работы в сети и т. Д.

Другие вопросы по тегам