Заикание при использовании SurfaceTexture и Camera (Android 4.0 ICS) - PullRequest
0 голосов
/ 11 января 2012

Я заметил интересную ошибку при использовании SurfaceTexture с Camera.

Если я установил SurfaceTexture, передайте ему действительную OpenGL текстуру и передайте ее в Cameraвсе отлично работает.Затем я могу заменить пиксельный шейдер простым шейдером, и все по-прежнему прекрасно работает.Но если я заменю пиксельный шейдер более сложным шейдером, частота кадров падает и появляется заикание.

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

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

Я пытался использовать glFinish и glFlush, но ни один из них не помог.Я задавался вопросом, было ли это потому, что камера использует samplerExternalOES и как-то это влияет?

Примечание: если я запускаю тот же код OpenGL, используя вместо него SurfaceView, я не заикаюсь.Конечно, производительность не так хороша, поэтому это может быть причиной.

1 Ответ

1 голос
/ 06 февраля 2012

Обратите внимание, что функции glFinish () и glFlush () в настоящее время не используются в Android. См. Frameworks / base / opengl / libagl / state.cpp в дереве исходного кода Android.

Самая полезная вещь, которую я смог найти в подобной ситуации, - поставить работу в очередь, а затем подключить методDrawFrame (), чтобы завершить работу, предполагая, что предыдущие операции были выполнены.

т.е. Я рендерил в текстуру, а затем вызывал glReadPixels для текстуры. Вызов glReadPixels напрямую вызывает много миллисекундный сон, пока он ожидает завершения рендеринга. Вместо этого я начал рендеринг, а затем в onDrawFrame () я вызвал glReadPixels. Это (обычно!) Приводило к немедленному запуску glReadPixels.

...