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
销毁了 EGLContext
和 EGLSurface
,但是在销毁 TextureView
对象后图形内存没有释放(我通过 Profiler 检查了它).
我发现所有内存只有在销毁我的 sharedContext
后才会释放。
有没有什么方法可以避免内存泄漏,从而在所有应用程序生命周期内保留 OpenGL 资源(精灵、字形)?
我发现了一个非常虚拟的解决方案,它不允许流出内存并在不同的屏幕上有很多 TextureView。我只是将我的 TextureView 保持为静态对象,并在片段的 onCreateView 方法中将我保留的 TextureView 放在一个特殊的占位符视图中。
之所以有效,是因为事实证明这些内存泄漏与 TextureView 的销毁和创建有关。
如果不销毁 TextureView,就不会发生内存泄漏。
我使用 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
销毁了 EGLContext
和 EGLSurface
,但是在销毁 TextureView
对象后图形内存没有释放(我通过 Profiler 检查了它).
我发现所有内存只有在销毁我的 sharedContext
后才会释放。
有没有什么方法可以避免内存泄漏,从而在所有应用程序生命周期内保留 OpenGL 资源(精灵、字形)?
我发现了一个非常虚拟的解决方案,它不允许流出内存并在不同的屏幕上有很多 TextureView。我只是将我的 TextureView 保持为静态对象,并在片段的 onCreateView 方法中将我保留的 TextureView 放在一个特殊的占位符视图中。
之所以有效,是因为事实证明这些内存泄漏与 TextureView 的销毁和创建有关。
如果不销毁 TextureView,就不会发生内存泄漏。