#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-функцию, которая загружала текстуры.