상세 컨텐츠

본문 제목

Android onPause OpenGL 컨텍스트 유지하는 방법

개발 환경/Graphics

by cepiloth 2018. 12. 4. 19:31

본문

728x90
반응형



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() 메소드를 직접 구현 되어 있다.


728x90
반응형

'개발 환경 > Graphics' 카테고리의 다른 글

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

관련글 더보기

댓글 영역