앱 화면은 어떻게 그려질까?
안드로이드의 렌더링 과정
- 레이아웃 인플레이션.
- 액티비티, 토스트, 다이어로그, 시스템바 등의 UI 요소는 각각 자신의 Window1를 가진다.
- LayoutInflater를 통해 레이아웃을 Inflate3하고 Window에 부착한다.
- 액티비티, 토스트, 다이어로그, 시스템바 등의 UI 요소는 각각 자신의 Window1를 가진다.
- 크기, 위치 결정.
- 뷰 트리를 순회하면서 각 뷰의 onMeasure() 메서드를 호출하여 뷰의 크기를 결정한다.
- 그 후, onLayout() 메서드를 호출하여 각 뷰의 위치를 확정한다. 이 과정에서 뷰는 자신의 크기와 부모 및 자식 뷰와의 관계에 따라 자신의 위치를 계산한다.
- 뷰 트리를 순회하면서 각 뷰의 onMeasure() 메서드를 호출하여 뷰의 크기를 결정한다.
- 드로잉.
- 렌더링.
- 캔버스에 그린 그림이 GPU에 의해 렌더링되어 Surface4 객체에 저장된다.
- Window Manager가 모든 Window의 메타데이터를 SurfaceFlinger로 전송한다.
- SurfaceFlinger는 각각의 Surface를 합성하여 최종 이미지를 생성한다.
- 캔버스에 그린 그림이 GPU에 의해 렌더링되어 Surface4 객체에 저장된다.
- 화면 리프레시.
- 화면의 리프레시율(Ex. 60Hz)에 맞춰 VSYNC 신호가 발생하고 화면이 리프레시된다.
- 화면의 리프레시율(Ex. 60Hz)에 맞춰 VSYNC 신호가 발생하고 화면이 리프레시된다.
1화면을 구성하는 단위. 하나의 Window는 하나의 레이아웃(뷰 객체 트리)와 매칭된다. WindowManager2을 통해 관리된다.
2Window의 생명 주기, 입력 및 포커스 이벤트, 화면 방향, 전환, 애니메이션, 위치, 변환, Z-order 등을 관리한다.
3레이아웃을 뷰 객체 트리로 변환하는 작업.
4화면에 그림을 그리기 위한 인터페이스. Window마다 하나씩만 존재하고, 내부적으로 이중 버퍼링5을 사용한다.
5화면에 표시되는 Front Buffer와 그림을 그리는 Back Buffer, 두 개의 그래픽 버퍼를 사용하는 방식. Back Buffer는 Lock 메커니즘을 통해 접근이 제어된다.