LINUX.ORG.RU

Непонятки с OpenGL и потоками

 , ,


1

1

Всем привет
Переписую одну игрушку, там есть момент когда создается несколько сцен и потом они добавляются на экран.
Одна из них создается доволько долго, вынес ее в отдельный поток, но после добавления на экран все спрайты белого цвета и конечно квадратные.
Это из-за контекста OpenGL? Аль как?
Возможно ее можно как-то передать корректно через binder какой-то.

Спасибо.

Было так

// MainScene.cpp
backgroundLayer = BackgroundLayer::node();
controlLayer = ControlLayer::node();
gameLayer = GameLayer::node();
Думал сделать так
// MainScene.cpp
boost::thread t(&MainScene::func, this);
backgroundLayer = BackgroundLayer::node();
controlLayer = ControlLayer::node();
t.join();
addChild->(gameLayer);
............
// MainScene.cpp
func(){
gameLayer = GameLayer::node();
}

Boy_from_Jungle ★★★★
() автор топика

дергать опенгл всегда надо из того же потока, в котором он был проинициализирован, насколько я знаю.

waker ★★★★★
()
Ответ на: комментарий от waker

вроде да, но думал может как-то можно передать через биндер, типа boost::bind. Пока ничего не вышло. Вот и спрашую

Boy_from_Jungle ★★★★
() автор топика
Ответ на: комментарий от Boy_from_Jungle

я не знаю ровным счетом ничего про буст, кроме того что это библиотека классов для c++. можно что угодно делать в другом потоке (например, грузить данные с диска), но вызовы opengl в конечном счете должны производиться в потоке в котором был создан контекст.

waker ★★★★★
()
Ответ на: комментарий от waker

Вроде бы у ребят из Qt получилось работать с GL из разных потоков.

В документации по GL где-то есть прямое указание, что все функции должны вызываться из одного потока?

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Вроде бы у ребят из Qt получилось работать с GL из разных потоков.

В Qt можно работать с GL из потока, отличного от главного, в котором рисуются виджеты; про многопоточный GL ничего не слышал.

annulen ★★★★★
()
Ответ на: комментарий от trex6

В документации по GL где-то есть прямое указание, что все функции должны вызываться из одного потока?

вобщем, я глянул в доки. я неправ. вызывать можно из другого потока. но нужно сделать контекст текущим в том потоке. вот ссыль: http://www.opengl.org/wiki/OpenGL_and_multithreading

применимо ли это к иксам — не знаю.

waker ★★★★★
()
Ответ на: комментарий от trex6

Тем не менее, opengl 1.* и 2.* является конечным автоматом с состояниями, любая работа из разных потоков в лоб вызовет смену состояний в неожиданный момент, отключение определённых состояний и, как следствие, белые квадраты вместо спрайтов.

Boy_from_Jungle, сцены обязательно отображать одновременно? Если нет, можно отобразить сначала лёгкие сцены, а далее в другом потоке рисовать тяжёлую в буфер, пока лёгкие уже показываются и интерфейс работает, но нужно будет блокировать передачу данных и смену состояний opengl с помощью мьютекса. А можно поискать проблемы в другом месте - в предварительных расчётах на цпу или недостаточном отсечении объектов, не попадающих на сцену.

quiet_readonly ★★★★
()
Ответ на: комментарий от waker

Хм, и правда, в два контекста и с выводом в буфер можно, наверное, управиться ;)

quiet_readonly ★★★★
()

там есть момент когда создается несколько сцен и потом они добавляются на экран

В терминах OpenGL операции «добавить на экран» нет. Что конкретно делается?

(Не стоит работать с GL из разных потоков, намучаетесь. Лучше делать вычисления в фоне, а результаты отправлять в поток отрисовки).

note173 ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

сорри, с opengl es я ни разу не сталкивался.

waker ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.