На эту статью обычно ссылаются, когда кто-то спрашивает о текстурах потокового видео в OpenGL.
В ней говорится:
Чтобы максимизировать производительность потоковой передачи, выможет использовать несколько объектов буфера пикселей.Диаграмма показывает, что 2 PBO используются одновременно;glTexSubImage2D () копирует данные пикселей из PBO, в то время как источник текстуры записывается в другое PBO.
Для n-го кадра PBO 1 используется для glTexSubImage2D (), а PBO 2 используется для получения нового источника текстуры.Для n + 1-го кадра 2 пиксельных буфера переключают роли и продолжают обновлять текстуру.Из-за асинхронной передачи DMA процессы обновления и копирования могут выполняться одновременно.CPU обновляет источник текстуры в PBO, в то время как GPU копирует текстуру из другого PBO.
Они предоставляют простую тестовую программу, которая позволяет вам переключаться между обновлениями текстуры без PBO, с одним PBO и с двумя PBO, используемыми, как описано выше.
Я вижунебольшое улучшение производительности при включении одного PBO.Но вторая PBO не имеет реальной разницы.
Прямо перед кодом glMapBuffer PBO, он вызывает glBufferData с указателем, установленным в NULL.Это делается для того, чтобы избежать задержки синхронизации.
// map the buffer object into client's memory
// Note that glMapBufferARB() causes sync issue.
// If GPU is working with this buffer, glMapBufferARB() will wait(stall)
// for GPU to finish its job. To avoid waiting (stall), you can call
// first glBufferDataARB() with NULL pointer before glMapBufferARB().
// If you do that, the previous data in PBO will be discarded and
// glMapBufferARB() returns a new allocated pointer immediately
// even if GPU is still working with the previous data.
Итак, вот мой вопрос ... Разве это не делает второй PBO совершенно бесполезным?Просто трата памяти!?
С двумя PBO данные текстуры сохраняются 3 раза.1 в текстуре и по одному в каждом PBO.
С одним PBO.Есть две копии данных.И временно только 3-й в том случае, если glMapBuffer создает новый буфер, потому что существующий в настоящее время DMA привязан к текстуре?
В комментариях предполагается, что внутренние драйверы OpenGL способны создавать второй буферЕСЛИ и только КОГДА требуется избегать остановки трубопровода.Используемый буфер используется для DMA, и мой вызов map дает мне новый буфер для записи.
Автор этой статьи, кажется, более осведомлен в этой области, чем я.Я полностью не понял суть?