В настоящее время я пытаюсь реализовать «поток загрузки» для очень простого игрового движка, который заботится о загрузке, например текстуры или аудио, пока основной поток продолжает отрисовывать правильное сообщение / экран до завершения операции, или даже отрисовывать обычные игровые сцены, в то время как загрузка более мелких объектов происходит в фоновом режиме.
Я далеко не эксперт по OpenGL, но поскольку я реализовал такой механизм «загрузки». Я быстро обнаружил, что OGL очень не нравится доступ к контексту рендеринга из потока, отличного от того, в котором он был создан. Я поискал в Google и нашел решение:
«Создать второй контекст рендеринга в потоке и поделиться им с контекстом основного потока»
Проблема в том, что я использую SDL, чтобы заботиться о своих управление окнами и создание контекста, и, насколько я могу судить по проверке API, нет способа указать SDL обмениваться контекстами между собой: (
Я пришел к выводу, что лучшие решения для моего случая:
Подход A) Измените библиотеку SDL для поддержки совместного использования контекста с помощью функций, специфичных для платформы (я предполагаю, что wglShareLists () и glXCreateContext ())
Подход B) Разрешите «Загрузка потока» только загружать данные в память и обрабатывать их быть в формате, удобном для OpenGL, и передать его в основной поток, который, например, заботится о загрузке текстуры в графический адаптер. Это, конечно, применимо только к данным, которые требуют наличия действительного контекста OpenGL
Первое решение, как я полагаю, является наименее эффективным. Я действительно не хочу возиться с SDL, и кроме того, я читал, что совместное использование контекста не является высокопроизводительной операцией. Итак, мой следующий подход пока что будет касаться второго подхода.
РЕДАКТИРОВАТЬ: Что касается «высокопроизводительной операции»: я неправильно прочитал статью, на самом деле это не так сильно требует высокой производительности. В статье предлагалось перенести интенсивные операции с ЦП на второй поток со вторым контекстом. Извините за это
После всего этого введения я был бы очень признателен, если бы кто-нибудь мог дать мне несколько советов и комментариев по следующим вопросам:
1) Есть ли способ поделиться контекстами с SDL, и было бы полезно в любом случае сделать это?
2) Есть ли какой-либо другой более «элегантный» способ загрузки моих данных в фоновом режиме, о котором я мог пропустить или не подумать?
3) Могу ли я принять во внимание мое намерение использовать подход B быть хорошим выбором? Все равно будут небольшие накладные расходы из-за операций OpenGL в моем основном потоке, который блокирует рендеринг, или они настолько малы, что их можно игнорировать?