Как выполнить очистку в собственной куче, когда контекст opengl потерян в GLSurfaceview в Android?

Делаю обертку для родного 3д движка. и я использовал GLSurfaceView для установки контекста egl для моего движка.

Проблема в том, что когда GLSurfaceView теряет свой контекст egl (onPause и т. д.), я действительно хочу освободить память, используемую движком. Однако, кажется, нет никакого способа сделать это безопасно.

Я пытаюсь переопределить функцию onPause в GLSurfaceView, как показано ниже:

@Override
public void onPause(){
Engine.release();
super.onPause();
}

Однако это вызовет проблемы с памятью.

04-06 21:33:40.415: E/libEGL(8249): call to OpenGL ES API with no current context (logged once per thread)
04-06 21:33:40.425: A/libc(8249): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)

Это может быть связано с тем, что память освобождена, но поток рендерера все еще работает.

Я думаю, что лучший способ сделать очистку — это освободить память в потоке рендерера непосредственно перед его завершением. Но я не знаю, как это реализовать.

Может ли кто-нибудь помочь мне?


person laugher    schedule 06.04.2014    source источник


Ответы (1)


GLSurfaceView осуществляет собственное управление контекстом EGL. Он берет на себя всю ответственность за его создание, уничтожение и обеспечение того, чтобы он был текущим в потоке рендерера, когда вызывается onDrawFrame().

Если это не то, что вам нужно, вы должны вместо этого использовать простой SurfaceView и выполнять различные вызовы EGL самостоятельно.

person fadden    schedule 06.04.2014