Android:使用共享 EGL 上下文时内存泄漏

Android: memory leaks when using shared EGL context

我使用 TextureView 来显示 OpenGL 图形。我有几个 TextureView 屏幕。我还有很多图形内容,例如精灵或文本字形,我不想在屏幕切换时再次创建它们。我发现 EGL 共享上下文可以帮助我。

val surfaceAttributes = intArrayOf(
    EGL14.EGL_WIDTH, 1,  
    EGL14.EGL_HEIGHT, 1,
    EGL14.EGL_NONE
)
sharedSurface = EGL14.eglCreatePbufferSurface(display, config, surfaceAttributes, 0)

val contextAttributes = intArrayOf(
    EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
    EGL14.EGL_NONE
)
sharedContext = EGL14.eglCreateContext(display, config, EGL14.EGL_NO_CONTEXT, contextAttributes, 0)

我将这些上下文和表面用作全局对象。当应用程序启动时,我加载所有必要的资源。对于每个 TextureView,我创建一个新的 EGLContext with sharedContext:

val context = EGL14.eglCreateContext(display, config, sharedContext, contextAttributes, 0)

它工作正常,但存在内存泄漏问题。我在 onSurfaceTextureDestroyed 方法中用 TextureView 销毁了 EGLContextEGLSurface,但是在销毁 TextureView 对象后图形内存没有释放(我通过 Profiler 检查了它).

我发现所有内存只有在销毁我的 sharedContext 后才会释放。

有没有什么方法可以避免内存泄漏,从而在所有应用程序生命周期内保留 OpenGL 资源(精灵、字形)?

我发现了一个非常虚拟的解决方案,它不允许流出内存并在不同的屏幕上有很多 TextureView。我只是将我的 TextureView 保持为静态对象,并在片段的 onCreateView 方法中将我保留的 TextureView 放在一个特殊的占位符视图中。

之所以有效,是因为事实证明这些内存泄漏与 TextureView 的销毁和创建有关。

如果不销毁 TextureView,就不会发生内存泄漏。