关于java:Android:在单独的EGL上下文中的GLSurfaceViews之间共享纹理

Android: Share a Texture Between GLSurfaceViews in Separate EGL Contexts

每个GLSurfaceView都有自己的EGLContext构造。在多个GLSurfaceViews上使用相同的上下文来访问相同的纹理似乎不适用于所有GPU(如此处所示)。

我的问题是,是否有一种方法可以在多个GLSurfaceViews中使用其默认的单独上下文共享GL_TEXTURE_EXTERNAL_OES纹理。默认情况下,只有创建GL_TEXTURE_EXTERNAL_OES的线程才能够访问该纹理,但是我正在寻找一种方法,让单独的EGL上下文中的其他线程从该纹理中读取,然后渲染为单独的GLSurfaceViews

任何指导将不胜感激。谢谢。


您不能在多个GLSurfaceViews之间共享上下文,因为该API无法提供共享上下文的方法。您可以尝试对其进行分类,但这可能会以令人不愉快的方式破坏。解决此问题的最佳方法是使用普通的SurfaceView。

请记住,GLSurfaceView只是一个SurfaceView,带有一些用于管理线程和EGL上下文的帮助程序代码。如果您不介意编写该零件(或只是将其从Grafika中批发出来),则使用SurfaceView会更加方便。

对于您问题的另一部分,可以在EGL上下文中共享外部纹理,但这很冒险。 Grafika的"显示捕获相机"活动与为MediaCodec创建的第二个上下文共享GLSurfaceView上下文,并从这两个上下文中访问纹理。不幸的是,这样做不正确,导致出现竞争状况。错误报告解释了问题和建议的解决方案,并且具有指向EGL / GLES文档的链接,这些文档指定了当单独线程上的多个上下文共享纹理时的行为。

FWIW,我还没有看到有一个GPU不能解决所讨论的Activity,因此我认为共享没有根本性的问题。您只需要正确地做障碍。但是,使用单个上下文要容易得多。