Intereting Posts
Как получить обобщенный размер экрана? Как написать / отладить Android.mk для статической библиотеки NDK? Аутентификация с App Engine из приложения Android с Federated Login (OpenID) Преобразование всех цветов, отличных от определенного цвета, в растровое изображение Макет на Samsung Galaxy Note Программируемое подключение к Bluetooth-гарнитуре из приложения для Android Как установить поля в пользовательский диалог? Android L Preview Материал в стиле Tabs Исключение в макете загрузки: java.util.LinkedHashMap.eldest () Ljava / util / Map $ Entry; Возможно ли запустить приложение Android-приложения при запуске телефона? Как сделать линейный макет, добавить дочерний вид в новую строку? Объединить пользовательский заголовок с FEATURE_PROGRESS Как публиковать частное приложение для Android бета-версии на рынке? Использование общих предпочтений между действиями Сохранить объект при изменении ориентации

Проблемы с частотой кадров GLSurfaceView на Nexus 5

У меня есть пример приложения ( полный источник ), который кодирует кадры камеры с помощью MediaCodec, показывая их на GLSurfaceView.

Systrace подтверждает, что каждые тридцать обратных вызовов:

Снимок экрана Systrace

Тем не менее, запись в виде записи ( .mp4 , YouTube ) показывает, что кажущаяся частота кадров значительно ниже.

Вкратце, мой цикл кодирования и отображения делает следующее:

  • Делает вход MediaCodec Surface EGL Context current
  • Рисует рамку камеры на поверхности EGC MediaCodec
  • Делает контекст контекста GLSurfaceView EGL
  • Рисует тот же кадр камеры на GLSurfaceView

На Galaxy Nexus LTE и Nexus 7 (оба с AOSP 4.4) приложение работает так, как ожидалось. Пока только Nexus 5 испытывает это несоответствие между количеством кадров, нарисованных на экране, и количеством видимых кадров …

Я молюсь, чтобы я не сумасшедший.

Я смог воспроизвести поведение, и мой помощник по работе с GL-специалистом выяснил эту проблему.

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

Я смог устранить проблему в своем коде, обновив класс рендеринга текстуры, изменив это:

 GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); 

к этому:

 GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); 

Un-bind и re-bind заставляет драйвер забрать правильный буфер.