OpenGL на Android: есть конфликты при вызове функций OpenGL как на Java, так и на C ?

#java #c #android #opengl-es #native

#java #c #Android #opengl-es #родной

Вопрос:

В моем приложении я использую стороннее пользовательское представление, которое вызывает функции OpenGL на Java, и я также вызываю функции OpenGL в моем собственном коде C .

Должно ли это быть проблемой?

Есть ли риск, что они могут быть вызваны одновременно?

Каков порядок потоков вызовов OpenGL в java / c ?

Ответ №1:

Это не должно быть проблемой, если вы знаете, что делаете. Привязки OpenGL Java в Android в основном просто вызывают одну и ту же функцию c . В этих вызовах больше нет логики. Таким образом, вы можете в основном думать об этих вызовах так же, как если бы они были прямым кодом c .

Проблема, с которой вы, скорее всего, столкнетесь, будет заключаться в том, что OpenGL не является потокобезопасным, если у вас есть только один контекст. Итак, если два потока попытаются вызвать методы gl в одном контексте (что обычно имеет место только в одном приложении), это вызовет проблемы. Вы можете избежать этих проблем, вызвав eglMakeCurrent, чтобы сделать ваш текущий поток текущим потоком OpenGL. И затем вы можете выполнять свои вызовы gl как обычно.

Ответ №2:

Вы не можете получить доступ к одному контексту OpenGL из разных потоков. Но это законно смешивать C и Java, последние являются просто оболочками для собственных вызовов.

Ответ №3:

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

Вы можете вызвать OpenGL как с Java, так и С , хотя не уверены, должно ли это быть в одном потоке.
В игре, которую я написал, я выполнял весь рендеринг на C , но загружал текстуры на Java (поскольку java имеет доступ к классу R), класс C вызывал java-функцию, которая загружала текстуры.