SDL / OpenGL: реализация «загрузки потока» - PullRequest
6 голосов
/ 25 июля 2011

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

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

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

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

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

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

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

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

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

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

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

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

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

1 Ответ

6 голосов
/ 26 июля 2011

Есть ли способ поделиться контекстами с SDL

Нет.

Да!

Вы должны получитьтекущий контекст, используя платформо-зависимые вызовы.Оттуда вы можете создать новый контекст и сделать его доступным, в том числе для вызовов, специфичных для платформы.

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

Не совсем.Вы перечислили параметры довольно хорошо: взломайте SDL, чтобы получить необходимые данные, или загрузите данные неэффективно.

Однако вы можете загрузить данные в сопоставленные буферные объекты и перенести данные в OpenGL ,Вы можете выполнять сопоставление / отмену сопоставления только в потоке OpenGL, но указатель, который вы получаете при отображении, можно использовать в любом потоке.Поэтому сопоставьте буфер, передайте его рабочему потоку.Он загружает данные в отображенную память и переключает переключатель.Поток GL отображает указатель (рабочий поток должен забыть о указателе сейчас) и загружает данные текстуры.

Может ли мое намерение перейти к подходу B считаться хорошим выбором?

Определить «хорошо»?Нет способа ответить на этот вопрос, не зная больше о проблемной области.

...