Не могу вызвать glGenTextures в многопоточном приложении для Android - PullRequest
2 голосов
/ 20 августа 2010

Я делаю Android-приложение OpenGLES, используя Android NDK, расширяясь от примера gljni для Android, который можно найти здесь

Он использует GLSurfaceView.Текстуры инициализируются в функции JNI, вызываемой из onSurfaceChanged () из GLSurfaceView.Renderer

Когда пользователь касается экрана, приложению требуется больше текстур.Для этого вызывается glGenTextures () в функции JNI, вызываемой в onTouchEvent ().

Проблема в том, что идентификатор потока (который возвращает gettid ()) кажется совершенно произвольным и не всегда одинаковым дляидентификатор потока, который имеет контекст OpenGL.

Он загружает и показывает текстуры, если функция JNI вызывается в том же потоке, но завершается ошибкой, если он находится в другом потоке.Так что он действует совершенно случайно.

Могу ли я сделать что-то вроде:

  • использовать контекст OpenGL, чтобы я мог успешно вызывать glGenTextures () в любом потоке.

  • сделать так, чтобы onTouchEvent () вызывался только в одном потоке с контекстом OpenGl

  • или во всем, что я могу заставить его работать

?

Спасибо

Ответы [ 4 ]

2 голосов
/ 20 августа 2010

Я получил его с помощью GLSurfaceView.queueEvent ().

В документе говорится, что GLSurfaceView тщательно разделяет поток пользовательского интерфейса и поток рендеринга, а

queueEvent () запускает код в потоке рендеринга.

2 голосов
/ 20 августа 2010

Это не случайное поведение, вот как OpenGL взаимодействует с потоками. Контекст актуален только для ОДНОГО потока, другие потоки не имеют GL-контекста, если вы специально не создадите контекст для каждого потока, который вы хотите использовать с OpenGL. Без контекста все вызовы GL не выполняются.

2 голосов
/ 20 августа 2010

Я не работал с NDK и OpenGL.Но с чистой версией Java, вы не можете делиться потоками.GLSurfaceView не любит делиться контекстами GL между потоками.Причина этого (насколько я могу судить) заключается в том, что после вызова drawFrame () контекст теряется.Если вы попытаетесь использовать этот контекст, но не внутри onSurfaceCreated, onSurfaceChanged или onDrawFrame (), ваши методы GL не будут работать.Следовательно, с другим потоком существует высокая вероятность того, что когда этот другой поток выполняется, поток GL уже завершил свой метод drawFrame (), что делает контекст недействительным.

0 голосов
/ 02 ноября 2013

Я описал решение только для Java для загрузки текстур в отдельном потоке в качестве ответа на другой вопрос: Процесс загрузки потоковых текстур для игры Android OpenGL

Он должен работать примерно так же, какНДК.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...