Як використовувати багатопотоковий додаток OpenGL для оновлення VBO і одночасно їх використовувати?


11

У мене просте застосування. У нього є дві нитки, кожна з яких має власний контекст візуалізації, але вони поділяють одне VBO (це працює, я тестував його).

Тепер що я хочу: Один потік передає деякі дані з першої половини VBO, а другий потік оновлює другу частину VBO.

Коли я не оновлюю VBO, він працює добре.

Але у мене є деякі дивні проблеми при оновленні. Коли я використовую glMapBufferдля оновлення VBO (у другому потоці), в першому потоці більшість часу він нічого не робить - весь екран зрозумілий (після glClearдзвінка). Схоже, він не може торкатися даних VBO (це зрозуміло, оскільки весь буфер відображений і тому його можна якось заблокувати).

Я намагався використовувати glMapBufferRange, який використовує GL_MAP_UNSYNCHRONIZED_BIT. Це повинно означати, "не чекайте і використовуйте VBO так, як вам потрібно, я (програма) синхронізую його сам". Крім того, коли я картографую діапазон VBO та надаю дані з іншої частини, він не повинен чекати, але у мене виникають ті самі проблеми, що і з нами glMapBuffer.

Хтось може допомогти мені виправити це чи пояснити, чому це відбувається?

Відповіді:


6

Якщо хтось зацікавився цією проблемою, ви можете знайти рішення на форумі OpenGL . В основному, буфери не можуть бути доступні одночасно двома потоками або контекстами, ні для читання, ні для запису. Тому потрібен такий фіксуючий механізм, як std::mutex.


Дякуємо за вказівку на рішення. Я відредагував вашу відповідь, щоб узагальнити її.
danijar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.