【问题标题】:OpenGL Context Loss in Service服务中的 OpenGL 上下文丢失
【发布时间】:2015-12-31 00:56:41
【问题描述】:

我正在继续我引用 here 的工作,但遇到了一些障碍。我有一个VirtualDisplay,它有一个写入帧的Surface,然后我使用相同的表面作为MediaCodec 的输入,以便对来自VirtualDisplay 的帧进行编码。这一切都发生在一些Threads 在Android Service NOTActivity 中运行。

我现在想在链中添加一个中介 Surface,以便进度将继续 VirtualDisplay -> 写入 SurfaceA -> 一些逻辑/功能 -> 写入 SurfaceB -> 编码 @987654334 @

经过一番努力,我创建了 SurfaceA,只使用直接的 OpenGL 和 EGL 调用,而不是使用 GLSurfaceView. 我使用 this 作为示例,说明我应该如何从 SurfaceA 写入 @987654338 @。据我了解,我只需要在一个 EGLContext 中包含两个 EGLSurfaces

据我了解,GL 上下文可能随时丢失,我可能需要重新创建 OpenGL 纹理(也许还需要重新创建 EGLSurfaces?)。这通常通过GLSurfaceView 处理,但由于我没有使用它,有没有一种简单的方法可以知道上下文何时丢失?即使我的工作都不涉及View 或者对用户可见,我是否应该只使用GLSurfaceView?如果没有Activity,如何调用onPauseonResume 获得GLSurfaceView

感谢您的帮助。

【问题讨论】:

    标签: android opengl-es android-mediacodec egl


    【解决方案1】:

    您想使用SurfaceTexture(a/k/a GLConsumer),它将到达 Surface 的帧转换为 GLES 纹理。它没有 View 组件。

    GLSurfaceView 是最糟糕的使用方式,因为它会在 Activity 暂停和恢复时创建和销毁其 EGL 上下文。 (EGL 上下文不会丢失 - 当它们被销毁时它们会消失。如果您关心上下文的生命周期,请不要使用 GLSurfaceView。)

    可以在Grafika 中找到各种 SurfaceTexture 使用示例。您可以将一个 EGL 上下文与两个 EGL 表面一起使用,或者将两个单独的 EGL 上下文与共享状态一起使用。前者可能更容易。

    另请参阅graphics architecture document

    【讨论】:

    • 对。我现在正在使用没有View 组件的SurfaceTexture。到目前为止,我的一切工作都没有问题。我相信 OpenGL 上下文可能会在断电/睡眠/等时丢失。问题更多的是“OpenGL 上下文是否丢失以及如何检测它们何时丢失?”
    • AOSP 代码不应丢弃它们。 GLES 驱动程序不应该能够区分前台应用程序和后台应用程序,因此如果驱动程序这样做,我预计前台应用程序会失败。您是否有一个可重现的测试用例显示 GLES 上下文在断电/睡眠时丢失?我希望任何 GLES 操作都会导致驱动程序出现“错误上下文”错误。
    • 我没有在我的代码中主动看到上下文丢失,我只记得在处理以前的 Android 项目(即游戏)时处理过 OpenGL 上下文丢失。我还看到了一堆关于 SO 的上下文丢失相关的问题,所以我想我会问。我的问题是试图解决潜在的问题。我目前在调用 swapBuffers 时检查 EGL 故障编码(其中之一是上下文丢失),如果失败,则抓取 EGL 错误并在那里执行上下文丢失行为,如果错误代码是上下文丢失。
    • 如果不是问题,那么我可以关闭/删除这个问题。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2021-06-30
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多