【问题标题】:Why is there no onSurfaceDestroyed method in GLSurfaceView.Renderer?为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?
【发布时间】:2014-12-24 11:36:42
【问题描述】:

我正在开发一个 Android 应用程序,该应用程序在相机视图上执行 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,我的清理代码应该放在哪里,为什么?

【问题讨论】:

  • 可能是因为 openGL 的东西被自动销毁了?
  • 但这并不妨碍提供回调方法,不是吗?
  • @hubeir ,不,但您需要实现自己的渲染器,然后处理 EGLContext/Surface 创建。
  • @harism,你能提供更多细节吗?我没有完全关注你。

标签: android opengl-es opencl glsurfaceview


【解决方案1】:

GLSurfaceView 是帮助程序代码的集合,可简化 OpenGL ES 与 SurfaceView 的使用。你不需要使用它来使用 GLES,如果你同时有很多其他的事情,我建议你不要这样做。

如果你比较使用 GLSurfaceView 的 Grafika 的“show + capture camera”和使用普通 SurfaceView 的“continuous capture”的复杂度,你可以看到后者需要一堆额外的代码来管理 EGL 和渲染器线程,但它也有更少的箍要跳过,因为它不必与 GLSurfaceView 的 EGL 和线程管理作斗争。 (只需阅读 CameraCaptureActivity 类顶部的 cmets。)

正如其中一位评论者所指出的,我怀疑没有“销毁时”回调,因为该类会积极销毁其 EGL 上下文,因此不需要进行 GLES 清理。渲染器线程有机会清理非 GLES 资源肯定会很有用,但事实并非如此,因此您必须通过 Activity 生命周期回调来处理它。 (在开发的某个阶段,CameraCaptureActivity 在渲染器线程上处理相机,但缺乏可靠的关闭回调使这变得困难。)

您的清理代码可能应该基于 Activity 生命周期回调。请注意,这些与 SurfaceView 回调有些分离。完整的解释可以在architecture doc appendix中找到。

【讨论】:

  • 感谢 fadden 的建议和信息。看起来我有一些阅读要做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2013-11-22
  • 1970-01-01
  • 2011-07-16
  • 2015-05-01
  • 2014-03-07
  • 2011-06-12
相关资源
最近更新 更多