Я продолжаю работу, на которую я ссылался here и ударил несколько коряг. У меня есть VirtualDisplay
, у которого есть Surface
, что кадры записаны, а затем я использую ту же поверхность, что и вход для MediaCodec
, так что кадры из VirtualDisplay
закодированы. Все это происходит в некоторых Threads
, которые запущены на Android Service
NOT в Activity
.Контекстная потеря OpenGL при обслуживании
Теперь я хочу, чтобы добавить промежуточный Surface
в цепочку таким образом, что прогресс будет идти VirtualDisplay
-> написать SurfaceA
-> некоторые логические/особенности -> Запись в SurfaceB
-> закодировать SurfaceB
Я создал, после большой борьбы, SurfaceA
, используя только прямые вызовы OpenGL и EGL, не используя GLSurfaceView.
Я использую this в качестве примера того, как я должен писать от SurfaceA
до SurfaceB
. По моему мнению, мне просто нужно два EGLSurfaces
в одном EGLContext
.
С моей точки зрения, контекст GL может быть потерян в любое время, и мне может понадобиться заново создать текстуру OpenGL (и, возможно, EGLSurfaces тоже?). Обычно это обрабатывается через GLSurfaceView
, но поскольку я не использую его, есть ли простой способ узнать, когда контекст потерян? Должен ли я просто использовать GLSurfaceView
, хотя ни одна из моих работ не связана с View
или отображается для пользователя? Как вы звоните и onResume
за GLSurfaceView
, если нет Activity
?
Спасибо за помощь.
Право. Я использую 'SurfaceTexture' прямо сейчас, у которого нет компонента' View'. У меня все работает до сих пор без проблем. Я считаю, что контексты OpenGL могут быть потеряны при отключении питания/sleep/etc. Вопрос был скорее о том, являются ли потери контекста OpenGL и как их обнаружить, когда они есть? – EncodedNybble
Код AOSP не должен выбрасывать их. Драйвер GLES не должен указывать разницу между приложением переднего плана и фоновым приложением, поэтому я ожидал бы, что приложение переднего плана завершится с ошибкой, если драйвер сделает это. У вас есть воспроизводимый тестовый пример, показывающий, что контексты GLES теряются при отключении питания/сна? Я ожидал бы, что любая операция GLES приведет к ошибке «плохого контекста» от драйвера. – fadden
Я не активно вижу потерю контекста в коде, который у меня есть, я просто помню, что имел дело с потерей контекста OpenGL при работе над предыдущими проектами Android (которые были играми). Я также видел кучу проблем, связанных с потерей контекста, на SO, поэтому я подумал, что спрошу. Мой вопрос был поставлен перед потенциальными проблемами. В настоящее время я проверяю кодировку с ошибкой EGL (одна из которых является потерей контекста) при вызове swapBuffers, и если это не удается, захват ошибки EGL и выполнение поведения потери контекста там, если код ошибки был потеря контекста. – EncodedNybble