Используйте команду opengl из другого потока - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть два потока: один основной поток (opengl) для 3d-рендеринга и один поток для логики.Как мне соединить потоки, если я хочу создать сетку блока в потоке рендеринга, если порядок исходит из логического потока?

В этом случае логический поток будет использовать команды opengl, что невозможно, поскольку каждая команда opengl должна выполняться только в основном потоке.Я знаю, что не могу разделить контекст opengl между разными потоками (что кажется плохой идеей), так как мне решить эту проблему?Существует ли какой-то шаблон проектирования общего назначения или что-то еще?Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

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

Другой подход заключается в использовании вспомогательного контекста OpenGL, который настроен для совместного использования данных первичного контекста OpenGL.,Вы можете сделать оба контекста актуальными одновременно в разных потоках.А для ядра OpenGL-3.x и более поздних версий вы можете создавать контекст без рисования.Затем вы можете использовать вспомогательный контекст для загрузки новых данных, буферов карты и т. Д.

0 голосов
/ 24 февраля 2019

Вы можете реализовать очередь команд рисования.Каждая команда рисования содержит все, что необходимо для выполнения необходимых вызовов OpenGL.Каждый кадр потока рендеринга (атомарно) очищает очередь и обрабатывает команды.Любой другой поток готовит свои собственные команды и (атомарно) ставит их в очередь в любое время.

Команды рисования могут быть реализованы как иерархия классов с виртуальным методом Draw.Конечно, это не маленькое изменение, и цены на внедрение этой системы не так уж и малы.

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