【问题标题】:Sharing the GLES20 context and textures between different GLSurfaceViews?在不同的 GLSurfaceView 之间共享 GLES20 上下文和纹理?
【发布时间】:2011-08-06 05:31:58
【问题描述】:

是否可以在不同的 GLSurfaceView 之间(在一个 Activity 内)共享 GLES20 上下文?或者,如何在不同的 GLSurfaceView 之间共享一组纹理?

在 iOS 上,如果您想在不同的 CAEAGLLayer 支持的 UIViews 中节省内存并重用(大)纹理,您可以在它们之间传递一个 EAGLContext 对象,或者使用共享一个公共 EAGLSharegroup 对象的不同 EAGLContexts。

我想知道如何在 Android 上实现这一点。有没有等效的技术?

编辑1

最初的建议是,实现您自己的 EGLContextFactory,这将返回相同的 EGLContext,这不起作用,因为每个 GLSurfaceViews 都将渲染分派到它自己的私有 gl 渲染线程,并且在不同线程之间共享相同的 EGLContext 是不可能的。

重新表述我最初的问题: 您在一个屏幕(一个 Activity)中有多个 GLSurfaceView,您需要在每个表面的单独 EGLContext 中访问一组常见但较大的纹理,但多次加载纹理会超出设备的内存。那么,您将如何在 GLSurfaceView 之间共享您的纹理?

【问题讨论】:

    标签: android multithreading opengl-es textures glsurfaceview


    【解决方案1】:

    以下代码适用于部分设备,但并非所有设备:

    public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
        EGLContext shared = .....;
    
        int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
        EGLContext context = egl.eglCreateContext(display, eglConfig, shared == null ? EGL10.EGL_NO_CONTEXT : shared,
            attrib_list);
    
        return context;
      }
    }
    

    【讨论】:

      【解决方案2】:

      似乎 setEGLContextFactory 可以在不同的 GLSurfaceView 之间使用相同的 GLES20 上下文。

      伪代码:

      private class MyEGLContextFactory implements EGLContextFactory {
          private static EGLContext mEGLContext;
      
          public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig config) {
              /* create EGLContext for GLES20 in first time */
              return mEGLContext;
          }
      
          public void destroyContext(EGL10 egl, EGLDisplay display,
                  EGLContext context) {
          }
      }
      

      【讨论】:

      • 谢谢一树。同时找到了一些示例代码,用于神奇的'/* create EGLContext for GLES20 in first time */' 部分:pastebin.com/5GDFwfmy
      • 不幸的是,它不起作用。我在“android.opengl.GLSurfaceView$EglHelper.createSurface(...)”中收到由“eglMakeCurrent failed: EGL_BAD_ACCESS”引起的“FATAL EXCEPTION: GLThread 14”。
      猜你喜欢
      • 2016-07-26
      • 2018-10-01
      • 1970-01-01
      • 2011-07-26
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多