android.opengl.GLSurfaceview 클래스는 아래와 같은 기능을 제공해 어플리케이션에서 OpenGL ES 렌더링을 쉽게 사용할수 있도록 해준다.
GLSurfaceView는 부분적으로 혹은 전체적으로 렌더링에 사용하는 어플리케이션을 작성하기 위해 좋은 기반이 된다. Google Map StreetView 와 같은 2D, 3D 데이터 비쥬얼 어플리케이션과 같은 2D, 3D 액션 게임이 좋은 후보가 될 것이다. 단순한 GLSurfaceView 어플리케이션 가장 단순한 OpenGL ES 어플리케이션의 소스코드를 보자.
이 프로그램은 많은 일을 하지는 않는다. 모든 프레임에 검은색으로 화면을 지운다. 하지만 안드로이드 activity 라이프 싸이클을 정확하게 구현한 완벽한 OpenGL 어플리케이션이다.이 프로그램은 activity가 pause 상태일때 렌더링을 pause 하고 activity가 resume 될때 렌더링을 resume 한다. 이 프로그램을 기본적인 비상호적 데모 프로그램으로 사용할 수 있다. ClearRenderer.onDrawFrame()메서드를 호출하기 위해 단순히 몇개의 OpenGL 호출을 추가했다. GLSurfaceview 를 상속할 필요가 없음에 주목하자. GLSurfaceView.Render 인터페이스는 3가지 메소드를 가지는데
사용자 입력은 어떡해?게임과 같은 상호 작용을 하는 어플리케이션을 원한다면 입력 이벤트를 받는 쉬운 방법을 제공받기 위해 GLSurfaceView를 상속해야한다. 어떻게 하는지 보여주는 조금 긴 예제를 보자.
이 어플리케이션은 모든 프레임을 위해 화면을 지운다. 사용자가 화면을 tap할때 사용자 touch 이벤트의 좌표값(x,y)에 기반해 색을 지운다. ClearGLSurfaceView.onTouchEvent()의 queueEvent()사용에 주목하자. queueEvent() 메서드는 UI 쓰레드와 렌더링 쓰레드간의 안전한 통신을 위해 사용된다. 원한다면 Renderer클래스 자체에서 동기화 메서드와 같은 자바 쓰레드간 통신기술을 사용할 수 있다. 하지만, 이벤트를 큐에 담는 것이 쓰레드간 통신을 다루는 것보다 더 안전한 방법이다. 다른 GLSurfaceView 샘플단순히 화면을 지우는 것이 지루한가? 안드로이드 SDK에 포함된 API데모를 통해 더 재미있는 예제들을 볼수 있다. 모든 OpenGL ES 샘플들은 GLSurfaceView를 사용하기 위해 변경 되었다.
surface 선택GLSurfaceView는 렌더링하고자하는 surface의 유형을 선택할수 있도록 도와준다. 서로 다른 안드로이드 디바이스 공통 부분을 가지지 않는 서로 다른 Surface 유형을 지원한다. 이것은 각 디바이스별로 가장 적절한 Surface를 선택하는데 어려움을 준다. 디폴트로 GLSurfaceView는 16비트 깊이를 가지는 버퍼와 16비트 RGB 프레임 버퍼에 가능한 가까운 surface를 찾으려고 시도한다. 개발하고자하는 어플리케이션의 니즈에 따라 이 동작을 변경하고자 할수도 있을 것이다. 예를 들어 반투명 GLSurfaceView 샘플은 반투명 데이터를 렌더링 하기 위해 알파 채널을 필요로 할 것이다. GLSurfaceView는 어떤 surface 유형을 사용할지 선택할수 있도록 하기 위해 setEGLSurfaceChooser() 메서드를 재정의할수 있도록 한다. setEGLConfigChooser(boolean needDepth)
setEGLConfigChooser(int redSize, int greenSize, int blueSize, int alphaSize, int depthSize, int stencilSize)
setEGLConfigChooser(EGLConfigChooser configChooser)
지속적인 렌더링 v.s 필요할때 렌더링게임과 시뮬레이션과 같은 대부분의 3D 어플리케이션은 지속적으로 에니메이션된다. 그러나 몇몇 3D어플리케이션은 더 많은 반응을 하게되는데 사용자가 무언가를 수행할때까지 기다리고 그것에 대응하는 것과 같은 것이다. 이런 유형의 어플리케이션들위해 화면을 지속적으로 다시 그리는 디폴트 GLSurfaceView 동작은 시간 낭비이다. 반응하는 어플리케이션을 개발한다면 지속적인 에니메이션 하지는 GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY) 를 호출 할 수 있고 다시 렌더링을 원할때는 GLSurfaceView.requestRender()를 호출 할 수 있다. 디버깅의 도움GLSurfaceView는 OpenGL ES 어플리케이션 디버깅을 위해 유용한 내장 기능을 가지고 있다.GLSurface.setDebugFlags() 메서드는 OpenGL ES호출시 오류를 확인 하거나 로깅을 가능하게 하는데 사용될 수 있다. setRenderer()를 호출하기 전에 GLSurfaceView의 생성자에서 이메소드를 호출한다.
|