Выделение ОПО в отдельном потоке? - PullRequest
2 голосов
/ 25 января 2012

У меня есть многопоточное приложение OpenGL, использующее PBO для передачи данных между процессором и процессором.

Я объединил распределение PBO, однако, когда пулы пусты, мои не-opengl потоки должны некоторое время блокироваться, пока поток OpenGL не достигнет точки, где он может выделить буферы (то есть закончил рендеринг текущего кадра) , Это ожидание вызывает некоторые лаги в определенных ситуациях, которых я бы хотел избежать.

Можно ли разместить PBO в другом потоке, который затем используется "основным" потоком OpenGL?

1 Ответ

4 голосов
/ 25 января 2012

Да, вы можете создавать объекты в одном потоке, которые можно использовать в другом. Для этого вам понадобится новый контекст GL.

При этом есть две проблемы.

Во-первых, это зависит от того, что вы подразумеваете под «распределением ОПО». Вы никогда не должны размещать буферные объекты в середине кадра. Вы должны выделить все необходимые буферы заранее. Когда придет время их использовать, вы можете просто использовать то, что у вас есть.

Под «распределением» я имею в виду вызов glBufferData для ранее выделенного буфера, используя другой размер или подсказку драйвера, чем использовался ранее. Или используя glGenBuffers и glDeleteBuffers любым способом. Ничто из этого не должно происходить в кадре.

Во-вторых, аннулирование буфера никогда не должно вызывать «скачков задержки». Под «аннулированием» я подразумеваю перераспределение буфера с glBufferData, используя тот же размер и подсказку об использовании, или используя glMapBufferRange с битом GL_INVALIDATE_BUFFER. Вы должны посмотреть на эту страницу о том, как потоковые данные объекта буфера для деталей. Если у вас возникли проблемы, то вы, вероятно, используете аппаратное обеспечение NVIDIA и используете неверную подсказку объекта буфера (например, используйте STREAM).

...