2014-04-06 2 views
0

네이티브 3D 엔진 용 래퍼를 만들고 있습니다. 그리고 GLSurfaceView를 사용하여 엔진에 egl 컨텍스트를 설정했습니다.안드로이드에서 GLSurfaceview에서 OpenGL 컨텍스트가 손실되면 원시 힙을 정리하는 방법?

문제는 GLSurfaceView가 egl 컨텍스트 (onPause 등)를 잃을 때 엔진이 사용한 메모리를 해제하고 싶다는 것입니다. 그러나 안전하게 할 수있는 방법이없는 것 같습니다.

나는 아래와 같이 GLSurfaceView의 기능 onPause를 대체하려고했습니다

@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)

메모리가 해제되지만 렌더 스레드가 아직 실행에 의한 수 있습니다.

정리를 수행하는 가장 좋은 방법은 렌더링이 끝나기 바로 전에 렌더러 스레드에서 메모리를 비우는 것입니다. 하지만 어떻게 구현해야할지 모르겠다.

누군가가 나를 도울 수 있을까요?

답변

1

GLSurfaceView은 자체 EGL 컨텍스트 관리를 수행합니다. onDrawFrame()이 호출되면 렌더러 스레드를 생성하고 파기하며 렌더러 스레드에서 최신 상태를 유지해야합니다.

원하는 내용이 아닌 경우 일반 SurfaceView을 사용하고 다양한 EGL 호출을 직접 실행해야합니다.