gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:59:15 25 4
gpt4 key购买 nike

我正在开发一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com