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