4

異なる GLSurfaceViews (1 つのアクティビティ内) 間で GLES20 コンテキストを共有することは可能ですか? あるいは、異なる GLSurfaceView 間で一連のテクスチャを共有するにはどうすればよいでしょうか?

iOS では、メモリを節約し、別の CAEAGLLayer がサポートする UIView で (大きな) テクスチャを再利用したい場合、それらの間で EAGLContext オブジェクトを渡すか、共通の EAGLSharegroup オブジェクトを共有する別の EAGLContext を使用できます。

Androidでこれをどのように達成するのだろうか。同等の技術はありますか?

編集1

同じ EGLContext を返す独自の EGLContextFactory を実装するという最初の提案は機能しません。これは、すべての GLSurfaceView がレンダリングを独自のプライベート gl レンダー スレッドにディスパッチし、異なるスレッド間で同じ EGLContext を共有できないためです。

私の最初の質問を言い換えると: 1 つの画面 (1 つのアクティビティ) に複数の GLSurfaceView があり、すべてのサーフェスの個々の EGLContext で共通だが大きなテクスチャのセットにアクセスする必要がありますが、テクスチャを複数回ロードするとデバイスのメモリを超えます。では、GLSurfaceView 間でテクスチャをどのように共有しますか?

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 に答える