3

私のアプリは 2 つのアクティビティで構成されています。典型的な Android UI ウィジェットを使用する通常のアクティビティと、JNI ベースの OpenGL ES ビューを使用する他のアクティビティです。

アプリは両方のアクティビティを切り替えるので、アクティビティを終了する前に OpenGL リソースを適切に解放する必要があると思います。(glDeleteProgram、glDeleteBuffers、glDeleteTextures を呼び出して ...)

hello-gl2 のサンプルを参照しましたが、OpenGL のセットアップ コードのみで、OpenGL の破棄/シャットダウン コードはありません。そのため、ネイティブの OpenGL リリース メソッドをどこで呼び出せばよいかわかりません。

次の 2 つの場所を試しましたが、エラー メッセージが表示されました。

E/libEGL(7224): 現在のコンテキストのない OpenGL ES API への呼び出し (スレッドごとに 1 回ログに記録)

class MyGLView extends GLSurfaceView
{
    ...
    private static class ContextFactory implements GLSurfaceView.EGLContextFactory {
        public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) { ... }

        public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) {
            // call native shutdown method, location #1
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder)
    {
        // call native shutdown method, location #2
    }
    ...

    public class Renderer implements GLSurfaceView.Renderer
    {
        public void onSurfaceCreated(GL10 gl, EGLConfig config)
        {
            // call native initialization method here: Works fine!
        }

        // no surface destroy callback method in GLSurfaceView.Renderer
    }
}

OpenGL リソースを正常に解放できる場所はどこですか? またはネイティブ部分で現在の OpenGL コンテキストを設定する方法は何ですか?

4

1 に答える 1

1

本当に必要ありません。GLSurfaceView が破棄されると、その EGL コンテキストが解放され、それに関連付けられているすべてのリソースが解放されます。

于 2012-08-29T06:58:53.793 に答える