before 2020/Android

[Android] SurfaceView란 무엇인가?

hom2s 2011. 7. 3. 18:48
어쩌다보니 SurfaceView을 써야할 일이 생겨 SurfaceView에 대해 간략하게 조사해보았다.
공식적으로 SurfaceView에 대한 디테일한 설명을 제공해주는 곳은 없었고
재야 고수님들의 블로그에서 찾은 정보와 정보와 약간의 코드 확인을 통해 정리해보았다.
아마 부분부분 약간(?)의 거짓말이 섞여있을 수도...;;;;;


SurfaceView란 무엇인가?

우선 view가 그려져서 우리 눈에 보이는 과정부터 알아보자.

일반적인 view는 onDraw()시점에 canvas에 무언가를 그리고 종료하게 된다.
하지만 그 순간에 바로 화면에 무언가가 그려지는 것은 아니다.

canvas에 그려진 그림은 GDI Thread를 통해 Window(WindowManager)에서 관리하는
ViewRoot 가 들고있는 Surface라는 곳에 저장되고 그려지게된다.
(ViewRoot은 언제나 뷰 계층구조 최상위에 위치하고 있따.)

여튼 이런식으로 여기저기에 Surface들이 생겨나게 되고(우리의 View, 혹은 
다른 UI에의한 Surface) 이들은 전부 Surface Flinger에 의해 FrameBuffer로
전달된다.
(Surface는 Parcelable을 구현하고 있다.)

Surface Flinger란 모든 Surface를 Frame Buffer에 던저주는 녀석으로
시스템내의 모든 Surface들을 하나로 통합하는 역할을 담당한다.
이 Surface는 2D, 3D 모두 해당된다.

(Surface는 더블버퍼링 구조를 지원한다.)-어떤식으로 적용되는지 아직 잘모르겠음

그럼 SurfaceView란 무엇인가??

SurfaceView란 빠른 rendering이 필요한 곳에 사용되는 View이다.
이것이 가능한 이유는 바로 SurfaceView는 GDI Thread가 아닌 다른
독립적인 Thread를 이용하여 View를 업데이트 하기 때문이다.

SurfaceView는 SurfaceHolder라는 SurfaceView를 관리하는 녀석을 제공한다.
이는 다른 일반적인 view처럼 surfaceview 스스로가 자신을 그리지 않기때문이다.
SurfaceView는 뷰 계층구조에서 onDraw()시 그냥 검은 화면만 보여준다.
바로 Window에 구멍을 덩그러니 뚫어 놓는것이다.

그럼 어떻게 그려지느냐?

바로 독립적인  thread를 이용하여 이 빈공간이 있는 Window 아래에 
그림을 그리는 것이다.

SurfaceHolder는 SurfaceView가 내부적으로 유지하고 있는 Surface로 부터
Canvas를 가져올수있다. 그곳을 통해 Surface에게 필요한 데이터를 전달하고
이는 다른 Surface처럼 SurfaceFlinger에 의해 FrameBuffer로 전달이된다.



참고자료 :