Android: утечки памяти при использовании общего контекста EGL - PullRequest
0 голосов
/ 02 ноября 2018

Я использую 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 и EGLSurface, связанные с TextureView в методе onSurfaceTextureDestroyed, но графическая память не освобождается после уничтожения объекта TextureView (я проверил это через Profiler).

Я обнаружил, что вся память освобождается только после уничтожения моей sharedContext.

Есть ли способ освободить от утечек памяти, чтобы сохранить ресурсы OpenGL (спрайты, глифы) в течение всего срока службы приложений?

1 Ответ

0 голосов
/ 12 декабря 2018

Я нашел очень глупое решение, которое не позволяет вытекать из памяти и иметь много текстурных представлений на разных экранах. Я просто сохраняю свой TextureView как статический объект, а в методе фрагмента onCreateView я помещаю свой сохраненный TextureView в специальное представление заполнителя.

Это работает, потому что, как оказалось, эти утечки памяти связаны с разрушением и созданием TextureView.

Если вы не уничтожите TextureView, утечки памяти не будет.

...