4

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

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

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

编辑1

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

改写我最初的问题:您在一个屏幕(一个活动)中有多个 GLSurfaceViews,您需要在每个表面的单个 EGLContext 中访问一组常见但较大的纹理,但多次加载纹理超出了设备的内存。那么你将如何在 GLSurfaceViews 之间共享你的纹理呢?

4

2 回答 2

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;
  }
}
于 2012-01-13T02:50:23.790 回答
0

似乎 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) {
    }
}
于 2011-04-15T14:51:36.453 回答