1. 문제
Android 상에서 GlSurfaceView 를 사용할 때 화면의 Focus 가 변경될 때 GlContext 를 초기화 하여 검은 화면이 나오는 문제가 있다.
안드로이드 Activity life Cycle 에서 onPause() 메소드가 호출될 때 GlSurfaceView 는 WindowFocusChanged 에 의해 생성한 쉐이더 및 텍스처를 모두 초기화 하게 된다. 다시 onResume()을 통해 App 으로 focus 가 돌와 왔을 때 쉐이더 및 텍스처가 없기 때문에 GL_ERROR 가 발생하게 된다.
이러한 문제로 인하여 Android Life Cylcle 을 참고하여 아래와 같은 코드를 추가해 보았다.
1 2 3 4 5 6 7 8 9 10 11 | @Override protected void onPause() { super.onPause(); mGLView.onPause(); } @Override protected void onResume() { super.onResume(); mGLView.onResume(); } | cs |
허나 이코드를 추가 한다고 하여도 이전의 생성한 쉐이더와 텍스처는 복구하지 못한다. 이전 그리는 객체에 상태를 기억하는 코드를 넣고 이전 상태에서 onPause()가 호출 됬을때 onResume()에서 복구 하기에는 case by case 로 많은 코드량과 작업량이 필요하게 되어 비효율적이다.
이러한 문제로 인하여 대게 두가지 방안으로 수정 한다.
방안 1
1 | glSurfaceView.setPreserveEGLContextOnPause(true); | cs |
Android 2.3 이상 API 에 제공하는 setPreserveEGLContextOnPause() 메소드를 사용 하여 화면 전환에 의해 GlContext 에서 생성한 리소스를 해제하지 않도록 하는 방법이 있다.
방안 2
Android 2.2 이하 API 에는 해당 메소드를 제공하지 않아 GlSurfaceView 를 직접 수정해야 한다.
https://pastebin.com/U4x5JjAr 에서 소스를 확인 하면은 setPreserveEGLContextOnPause() 메소드를 직접 구현 되어 있다.
SKIA #2 - build option (0) | 2019.03.18 |
---|---|
OpenGL - GLUT 윈도우의 기능 (0) | 2018.09.06 |
OpenGL - 클릭 시 원 그리기 (0) | 2018.09.04 |
OpenGL - 흑색 바탕에 백색 사각형 그리기 (0) | 2018.09.04 |
SKIA #1 - introduce (0) | 2018.09.04 |
댓글 영역