Есть приложение с нативной частью, которая рисует графику через OpenGL ES 2.0 и с java частью которая показывает диалоги со стандартными андроидскими виджетами.
Проблема в том что при повторном запуске все картинки диалогах заменяются на какой то мусор если вручную удалять в native части текстуры и fbo. Тоесть вместо текста например просто серые или чёрные квадратики.
Если удалять vbo то приложение просто падает на некоторых девайсах.
Нормально ли такое поведение? После моих поисков по гуглу выяснил что vbo нужно создавать и удалять в одном и том же потоке. Это же правило видимо распространяется на остальные объекты гла.
После показывания диалога андроид может переместить native часть в другой поток?
Andrioid 4.0.4
NDK: r8c
по своему опыту: все операции с огл объектами должны проводиться в главном потоке
загрузка текстур в память - может быть в второстепенном потоке но glGenTextures и glBindTexture только в главном
крит секции не помогают - приложение падало хаотично в неопределенные моменты если с текстурами работал из потока.
с рендером ситуация такая же - нестабильная работа.
есть мнение что огл тупа под один поток заточен
в том то и дело что никаких дополнительных потоков не создаётся, вся работа идёт в одном.
но по всей видимости андроид, после показа диалога, без проса перекидывает всю натив часть в другой поток. из за этого гл и плющит.
если диалоги не открывать, то всё спокойно чистится без влияния на дальнейшую работу.
eglMakeCurrent ?
Если используете 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.
Сам андроид никаких дополнительных потоков создавать не будет, если только вы их не создали. Скорее всего просто неправильно организована работа с потоками.
eyenie
спасибо, тогда лажа в том что я чистил видеопамять при вызове onDestroy у активити.
как я понял в GLSurfaceView.Renderer нет обработчика типа onSurfaceDestroyed. получается париться об удалении объектов гла вообще не стоит?
Возникла куча вопросов по андроиду и OpenGL ES, тема вроде подходящая.
По-моему я где-то слышал, что в одном приложении нельзя создавать несколько контекстов. Это правда?
Можно ли из нескольких потоков обращаться к одним и тем же ресурсам? Умеет ли android шарить ресурсы между контекстами? Можно ли в нём создать контекст OpenGL ES 2.0 вообще без окна? Сильно ли медленный eglMakeCurrent?
если удаляется(теряется) контекст, GL-ресурсы руками удалять не надо, идентификаторы уже будут невалидными
если использовать egl напрямую без GLSurfaceView, шаринг контекстов где-то работает, где-то - нет
Тема в архиве.