我正在开发一款在相机视图上执行OpenCL / OpenGL互操作的Android应用。我正在使用GLSurfaceView.Renderer。当然,从onSurfaceCreated调用创建和初始化OpenCL运行环境(来自OpenGL)的代码,并且每个预览框架的实际处理都在onDrawFrame中进行。
一切顺利,除非我完成,我想清理OpenCL的东西。理想情况下,onSurfaceDestroyed方法是清理的最佳位置,但there is no such method in GLSurfaceView.Renderer。所以清理代码无处可去,我的应用程序可能存在内存泄漏。
以下是我的问题:
为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?有onSurfaceCreated和onSurfaceChanged。人们会期望onSurfaceDestroyed在那里。
鉴于GLSurfaceView.Renderer中不存在onSurfaceDestroyed,我的清理代码应该放在哪里,为什么?
答案 0 :(得分:5)
GLSurfaceView
是一个帮助代码集合,简化了OpenGL ES与SurfaceView的使用。您不需要使用它来使用GLES,如果您同时还有其他一些东西在进行,我建议您不要这样做。
如果将使用GLSurfaceView的Grafika“show + capture camera”的复杂性与使用普通SurfaceView的“continuous capture”进行比较,您会发现后者需要一堆额外的代码来管理EGL和渲染器线程,但它也有更少的跳跃,因为它不必与GLSurfaceView的EGL和线程管理斗争。 (只需阅读CameraCaptureActivity类顶部的注释。)
正如其中一位评论者指出的那样,我怀疑没有“被破坏”的回调,因为该类积极破坏其EGL上下文,因此不需要GLES清理。渲染器线程有可能有机会清理非GLES资源,但事实并非如此,因此您必须通过Activity生命周期回调来处理它。 (在开发的某个阶段,CameraCaptureActivity在渲染器线程上处理了摄像头,但缺乏可靠的关闭回调使得这很困难。)
您的清理代码应该基于Activity生命周期回调。请注意,这些与SurfaceView回调有些不同。可以在architecture doc appendix中找到完整的说明。