Войти
AndroidФорумОбщее

Проблема совместной работы OpenGL и стандартного UI

#0
13:57, 16 апр. 2013

Есть приложение с нативной частью, которая рисует графику через OpenGL ES 2.0 и с java частью которая показывает диалоги со стандартными андроидскими виджетами.
Проблема в том что при повторном запуске все картинки диалогах заменяются на какой то мусор если вручную удалять в native части текстуры и fbo. Тоесть вместо текста например просто серые или чёрные квадратики.
Если удалять vbo то приложение просто падает на некоторых девайсах.

Нормально ли такое поведение? После моих поисков по гуглу выяснил что vbo нужно создавать и удалять в одном и том же потоке. Это же правило видимо распространяется на остальные объекты гла.
После показывания диалога андроид может переместить native часть в другой поток?

Andrioid 4.0.4
NDK: r8c


#1
14:07, 16 апр. 2013

по своему опыту: все операции с огл объектами должны проводиться в главном потоке
загрузка текстур в память - может быть в второстепенном потоке но glGenTextures и glBindTexture только в главном
крит секции не помогают - приложение падало хаотично в неопределенные моменты если с текстурами работал из потока.
с рендером ситуация такая же - нестабильная работа.

есть мнение что огл тупа под один поток заточен

#2
14:13, 16 апр. 2013

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

#3
16:00, 16 апр. 2013

eglMakeCurrent ?

#4
16:32, 16 апр. 2013

Если используете GLSurfaceView, то все операции GLSurfaceView.Renderer (onDrawFrame, onSurfaceCreated, onSurfaceChanged) выполняются в отдельном (GL) потоке. Все операции с OpenGLES надо выполнять в этом потоке. Все операции со стандартными виджетами должны выполнятся в главном UI потоке.
  Если хотите что-то выполнить в GL потоке из UI потока, то можно использовать метод GLSurfaceView.queueEvent. Если же из GL потока надо что-то сделать с виджетами, то можно использовать Handler ( http://developer.android.com/reference/android/os/Handler.html ), или метод у Активити runOnUiThread.
Сам андроид никаких дополнительных потоков создавать не будет, если только вы их не создали. Скорее всего просто неправильно организована работа с потоками.

#5
18:09, 16 апр. 2013

eyenie
спасибо, тогда лажа в том что я чистил видеопамять при вызове onDestroy у активити.
как я понял в GLSurfaceView.Renderer нет обработчика типа onSurfaceDestroyed. получается париться об удалении объектов гла вообще не стоит?

#6
23:08, 13 мая 2013

Возникла куча вопросов по андроиду и OpenGL ES, тема вроде подходящая.

По-моему я где-то слышал, что в одном приложении нельзя создавать несколько контекстов. Это правда?
Можно ли из нескольких потоков обращаться к одним и тем же ресурсам? Умеет ли android шарить ресурсы между контекстами? Можно ли в нём создать контекст OpenGL ES 2.0 вообще без окна? Сильно ли медленный eglMakeCurrent?

#7
23:24, 18 мая 2013

если удаляется(теряется) контекст, GL-ресурсы руками удалять не надо, идентификаторы уже будут невалидными

если использовать egl напрямую без GLSurfaceView, шаринг контекстов где-то работает, где-то - нет

AndroidФорумОбщее

Тема в архиве.