이전 포스트에서 다루었던 [View에서 Canvas에 도형 그리기]를 이번에는 SurfaceView에서 구현해 보았다. 이번 포스트의 구성은 다음의 4가지로 요약할 수 있다.
- 정리 및 요약
- 화면구성
- SurfaceView
- Thread on SurfaceView
1. 정리 및 요약
본 보고서는 SurfaceView가 무엇이며 어떻게 구성되는지를 이해하는데 목적을 둔다.
- SurfaceView : 왜 SurfaceView를 사용하는가, SurfaceView는 어떻게 구성되는가.
- Thread on Surface : SurfaceView와 Thread는 어떤 관계가 있고 어떤 의미를 가지는가.
이전 포스트에서 다뤘던 것과 마찬가지로 새로운 클래스를 생성하여 SurfaceView를 상속받아 맏들어지며 조금 다른 점은 Thread를 사용한다는데 있다.
SurfaceView는 다른 View 들과 달리 직접 Contents를 다루지 않는다. 왜냐하면 View의 경우에는 화면을 구성하는 연산, 사용자와의 상호작용 처리, 나머지 연산 등을 모두 하나의 쓰레드에서 처리하지만 SurfaceView의 경우에는 화면 업데이트를 백그라운드 쓰레드로 수행하여 처리하기 때문이다. 즉, View에서는 성능의 문제가 생길 수 있으니 SurfaceView를 사용하는 것이다.
(참고 : SurfaceView의 이해)
위의 그림를 참고해서 이야기하자면 SurfaceView 내의 Surface를 관리하는 것은 SurfaceHolder이다. SurfaceView를 상속받아서 SurfaceHolder를 얻고 CallBack을 연결시키게 되면 Surface를 다룰 수 있는 준비가 끝나는 것이다.
또한 Surface View를 상속받게 되면 다음의 3가지 메서드를 생성해 줘야 한다.
Code에 대한 이야기는 최대한 생략하고자 하기 때문에 간단히 설명하고 넘어가겠다.
public void surfaceCreated(SurfaceHolder holder);
public void surfaceDestroyed(SurfaceHolder holder);
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h);
위에서 부터 차례대로 SurfaceView가 처음 생성될때, 소멸될때, SurfaceView의 format이나 size가 변경될 때 호출되는 메서드다.
위에서 언급한 바와 같이 SurfaceView는 백그라운드에서 쓰레드를 사용하게 된다. 보통 이러한 쓰레드를 따로 클래스로 빼서 생성하고, SurfaceView를 상속받는 클래스에서 그 쓰레드를 돌리는 구조로 만들어진다.
다음의 그림을 참고해보자.
(참고 : SurfaceView란 무엇인가?)
즉, thread에서 만들어서 화면으로 올린다는 의미다. 이러한 과정이 쓰레드에서 이루어지는데 Holder로부터 Canvas를 가져와서 Lock을 시킨다음 그린 다음에 UnLock을 하면 비로소 화면으로 올라간다.
(참고 : SurfaceView Double Buffering)
코드에 대한 설명을 최대한 배제하고자 하였기 때문에 이 포스트를 통해 코드를 작성하는 법을 배우기에는 조금 힘들 것이다. 하지만 이 포스트를 이해했다면 코드를 이해하기가 쉬워질 것이다. 코드가 궁금하신 분들을 위하여 아래에 링크로 프로젝트 자체를 포멧하여 올려둔다.
참고하실분 다운 받으세요^^
댓글 없음:
댓글 쓰기