Android 为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?

Android 为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?,android,opengl-es,opencl,glsurfaceview,Android,Opengl Es,Opencl,Glsurfaceview,我正在开发一个Android应用程序,它在camera perview上执行OpenCL/OpenGL互操作。我正在使用GLSurfaceView.Renderer。当然,创建和初始化OpenCL运行环境的代码(来自OpenGL)是从onSurfaceCreated调用的,每个预览帧的实际处理都在onDrawFrame中进行 所有的工作都很好,除了当我完成的时候,我想清理OpenCL的东西。理想情况下,一个表面破坏的方法将是一个完美的地方清理,但。所以清理代码无处可去,我的应用程序中可能存在内存

我正在开发一个Android应用程序,它在camera perview上执行OpenCL/OpenGL互操作。我正在使用GLSurfaceView.Renderer。当然,创建和初始化OpenCL运行环境的代码(来自OpenGL)是从onSurfaceCreated调用的,每个预览帧的实际处理都在onDrawFrame中进行

所有的工作都很好,除了当我完成的时候,我想清理OpenCL的东西。理想情况下,一个表面破坏的方法将是一个完美的地方清理,但。所以清理代码无处可去,我的应用程序中可能存在内存泄漏

以下是我的问题:

  • 为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?有onSurfaceCreated和onSurfaceChanged。有人会期待在那里

  • 鉴于GLSurfaceView.Renderer中不存在onSurfaceDestroyed,我的清理代码应该放在哪里,为什么


  • GLSurfaceView
    是一组帮助程序代码,可简化OpenGL ES与SurfaceView的使用。你不需要使用它来使用GLES,如果你同时有很多其他的东西在进行,我建议你不要这样做

    如果您将Grafika的“”的复杂性(使用GLSurfaceView)与使用普通SurfaceView的“”进行比较,您会发现后者需要大量额外的代码来管理EGL和渲染器线程,但它也没有太多的麻烦,因为它不必与GLSurfaceView的EGL和线程管理抗争。(请阅读CameraCaptureActivity类顶部的注释。)

    正如一位评论者指出的,我怀疑没有“on destromed”回调,因为该类会主动破坏其EGL上下文,因此不需要进行任何清理。渲染器线程有机会清理非GLE资源当然是有用的,但事实并非如此,因此您必须通过活动生命周期回调来处理这一点。(在开发过程中,CameraCaptureActivity曾在渲染器线程上处理摄影机,但由于缺少可靠的关闭回调,因此很难做到这一点。)


    清理代码可能应该基于活动生命周期回调。请注意,这些调用与SurfaceView回调有些不相关。完整的解释可以在.

    中找到,可能是因为openGL的东西被自动销毁了?但这并不能阻止回调方法的提供,是吗?@hubeir,不是,但您需要实现自己的渲染器,然后它处理EGLContext/曲面创建。@harism,您能提供更多详细信息吗?我不太明白你的意思。谢谢法登的建议和信息。看来我有一些书要读。