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

标签 android opengl-es opencl glsurfaceview

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

一切正常,除了当我完成后,我想清理 OpenCL 的东西。理想情况下,onSurfaceDestroyed 方法是清理的理想场所,但是 there is no such method in GLSurfaceView.Renderer .所以清理代码无处可去,我的应用程序中可能存在内存泄漏。

这是我的问题:

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

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

最佳答案

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 中找到。 .

关于android - 为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26618940/

相关文章:

c++ - OpenCV OpenCL 线程安全 - 死锁(将 cv::Mat 更改为 UMat)

opengl-es - OpenGL ES 2.0 : Attribute vs Layout?

android - 如何安全退出 HandlerThread 的 looper

android - 仅获取 SIM 卡和设备存储的联系人

android - 从另一个包引用 layout.xml

android - 如何使用 OpenGL ES 将纹理加载到圆上

android - 模拟器未运行 OpenGL 应用程序,消息为 "Unfortunately, OpenGL ES 2.0 Basic has stopped"

c - OpenCL 内核执行速度比单线程慢

OpenCL - 迭代更新 GPU 驻留缓冲区?

android - 如何从 Android 应用程序发送/打开电子邮件附件?