在不同的GLSurfaceViews之间共享GLES20上下文和纹理?

时间:2011-04-15 10:25:52

标签: android multithreading opengl-es textures glsurfaceview

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

在iOS上,如果要在不同的CAEAGLLayer支持的UIViews中保存内存和重用(大)纹理,可以在它们之间传递EAGLContext对象,或使用共享EAGLSharegroup对象的不同EAGLContexts。

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

EDIT1

初始建议,实现自己的EGLContextFactory,它将返回相同的EGLContext,因为每个GLSurfaceViews都会将渲染调度到它自己的私有gl渲染线程并且在不同线程之间共享相同的EGLContext是不可能的。< / p>

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

2 个答案:

答案 0 :(得分: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;
  }
}

答案 1 :(得分:0)

似乎setEGLContextFactory可以在不同的GLSurfaceViews之间使用相同的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) {
    }
}