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

时间:2018-11-02 09:09:58

标签: android memory-leaks opengl-es egl

我使用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创建一个新的sharedContext

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

它可以正常工作,但是存在内存泄漏的问题。我在EGLContext方法中销毁了EGLSurfaceTextureView发起的onSurfaceTextureDestroyed,但是销毁TextureView对象后图形内存无法释放(我通过Profiler对其进行了检查)。

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

在所有应用程序生命周期中,是否有任何方法可以避免内存泄漏以保留OpenGL资源(精灵,字形)?

1 个答案:

答案 0 :(得分:0)

我找到了一个非常虚拟的解决方案,该解决方案不允许内存不足,并且在不同的屏幕上都有很多TextureViews。我只是将TextureView保留为静态对象,并在片段的onCreateView方法中将保留的TextureView放置在特殊的占位符视图中。

之所以起作用,是因为事实证明,这些内存泄漏与破坏和创建TextureView有关。

如果不破坏TextureView,则不会发生内存泄漏。