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

hub*_*eir 6 android opengl-es opencl glsurfaceview

我正在开发一款在相机视图上执行OpenCL/OpenGL互操作的Android应用.我正在使用GLSurfaceView.Renderer.当然,从onSurfaceCreated调用创建和初始化OpenCL运行环境(来自OpenGL)的代码,并且每个预览框架的实际处理都在onDrawFrame中进行.

一切顺利,除非我完成,我想清理OpenCL的东西.理想情况下,onSurfaceDestroyed方法是清理的最佳位置,但GLSurfaceView.Renderer中没有这样的方法.所以清理代码无处可去,我的应用程序可能存在内存泄漏.

这是我的问题:

  1. 为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?有onSurfaceCreated和onSurfaceChanged.人们会期望onSurfaceDestroyed在那里.

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

fad*_*den 5

GLSurfaceView是一个帮助代码的集合,简化了OpenGL ES与SurfaceView的使用.您不需要使用它来使用GLES,如果您同时还有其他一些东西,我建议您不要这样做.

如果你将使用GLSurfaceView的Grafika" show + capture camera " 的复杂性与使用普通SurfaceView的" 连续捕获 "进行比较,你可以看到后者需要一堆额外的代码来管理EGL和渲染器线程,但是它也有更少的跳跃,因为它不必与GLSurfaceView的EGL和线程管理斗争.(只需阅读CameraCaptureActivity类顶部的注释.)

正如其中一位评论者指出的那样,我怀疑没有"被破坏"的回调,因为该类积极破坏其EGL上下文,因此不需要GLES清理.渲染器线程有可能有机会清理非GLES资源,但事实并非如此,因此您必须通过Activity生命周期回调来处理它.(在开发的某个阶段,CameraCaptureActivity在渲染器线程上处理了摄像头,但缺乏可靠的关闭回调使得这很困难.)

您的清理代码应该基于Activity生命周期回调.请注意,这些与SurfaceView回调有些不同.可以在架构文档附录中找到完整的解释.