SDL / OpenGL: реализация «Загрузка потока»

В настоящее время я пытаюсь реализовать «поток загрузки» для очень простого игрового движка, который заботится о загрузке, например текстуры или аудио, пока основной поток продолжает отрисовывать правильное сообщение / экран до завершения операции, или даже отрисовывать обычные игровые сцены, в то время как загрузка более мелких объектов происходит в фоновом режиме.

Я далеко не эксперт по OpenGL, но поскольку я реализовал такой механизм «загрузки». Я быстро обнаружил, что OGL очень не нравится доступ к контексту рендеринга из потока, отличного от того, в котором он был создан. Я поискал в Google и нашел решение:

«Создать второй контекст рендеринга в потоке и поделиться им с контекстом основного потока»

Проблема в том, что я использую SDL, чтобы заботиться о своих управление окнами и создание контекста, и, насколько я могу судить по проверке API, нет способа указать SDL обмениваться контекстами между собой: (

Я пришел к выводу, что лучшие решения для моего случая:

Подход A) Измените библиотеку SDL для поддержки совместного использования контекста с помощью функций, специфичных для платформы (я предполагаю, что wglShareLists () и glXCreateContext ())

Подход B) Разрешите «Загрузка потока» только загружать данные в память и обрабатывать их быть в формате, удобном для OpenGL, и передать его в основной поток, который, например, заботится о загрузке текстуры в графический адаптер. Это, конечно, применимо только к данным, которые требуют наличия действительного контекста OpenGL

Первое решение, как я полагаю, является наименее эффективным. Я действительно не хочу возиться с SDL, и кроме того, я читал, что совместное использование контекста не является высокопроизводительной операцией. Итак, мой следующий подход пока что будет касаться второго подхода.

РЕДАКТИРОВАТЬ: Что касается «высокопроизводительной операции»: я неправильно прочитал статью, на самом деле это не так сильно требует высокой производительности. В статье предлагалось перенести интенсивные операции с ЦП на второй поток со вторым контекстом. Извините за это

После всего этого введения я был бы очень признателен, если бы кто-нибудь мог дать мне несколько советов и комментариев по следующим вопросам:

1) Есть ли способ поделиться контекстами с SDL, и было бы полезно в любом случае сделать это?

2) Есть ли какой-либо другой более «элегантный» способ загрузки моих данных в фоновом режиме, о котором я мог пропустить или не подумать?

3) Могу ли я принять во внимание мое намерение использовать подход B быть хорошим выбором? Все равно будут небольшие накладные расходы из-за операций OpenGL в моем основном потоке, который блокирует рендеринг, или они настолько малы, что их можно игнорировать?

6
задан PuerNoctis 25 July 2011 в 20:32
поделиться