https://jungwoon.github.io/android/2019/10/02/How-to-draw-View/
* View 가 그려지는 과정
1. Measure
2. Layout
3. Draw
> 위 과정이 16ms 안에 이루어지면 이상적이다
(60 FPS 기준 - 즉, 사람의 눈에 인지되는 1 Frame 안에 그려지면)
> Background -> Src -> Foreground 가 차례로 그려진다
* Measure
> Parent 부터 Child 로 탐색. Child 는 부모에게 자신의 크기 정보를 전달한다. Parent 는 자신의 크기 측정 or Child View 의 크기를 결정하는데
정보가 부족하면, 강제로 모든 Child View 의 크기를 재 측정한다. 이 경우에는 2~3 번의 측정 단계가 반복될 수 있다
> 따라서, 충첩이 적은 레이아웃 구조가 좋다
> View 재측정
: RelativeLayout 의 경우, 여러 번의 측정이 필요하다
: LinearLayout 도 weight 특성을 사용하는 경우에는 Chid View 의 정확한 정보를 얻기 위해 기본적으로 2번의 측정 단계를 거친다
* Layout
> Child View 를 배치한 후, Parent View 를 배치한다 (Bottom -> Top)
* View 를 그릴 때 성능 최적화하는 방법
> merge tag 를 사용
> 각 View 에 사용되는 Object 수 줄이기
> 하나의 Drawable Resource 에 Tint 사용하여 여러 색상으로 표현하기
: drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
* View Drawing
> Parent 를 그린 후, Child 가 그려진다
> Over Draw
: 이미 그려진 화면을 다시 그리는 것
- 개발자 옵션 - 'GPU Overdraw Debuging' 을 통해 확인 가능
- 흰색 (1) > 파랑색 (2) > 녹색 (3) > 밝은 빨강색 (4)
: 어떤 뷰가 화면에 보여야 되는지 모르기 때문에 그 픽셀을 포함하고 있는 모든 뷰를 다시 그림
: Kitkat 부터는 다른 뷰에 의해 완전히 덮어져 있는 뷰의 경우, 시스템에서 그려지지 않도록 미리 제거
1. App 에서 View 측정 후, Render Thread 가 정보 전달
2. Render Thread 에서 프레임을 그리고, 그리기 버퍼를 내보냄
3. 버퍼를 가져와서 버퍼링된 뷰 리스트로 보냄
4. Surface Flinger 가 버퍼 큐에서 뷰를 하나 가져옴
5. GPU 에 의해 화면에 그려짐
- findViewById() 호출 시, 같은 id 값을 가지는 view 가 있는 경우에 먼저 view hierarchy 에 추가된 view 가 리턴됨.
따라서, parentView.getChild().getId() 값을 체크해서 하나씩 확인해야 됨
- 같은 Layout 을 Inflater 를 통해 inflate 하더라도 2개의 instance 가 생성됨
'SW > Android' 카테고리의 다른 글
Zygote (0) | 2020.08.15 |
---|---|
ANR (Application Not Responding) (0) | 2020.08.15 |
//RecyclerView (0) | 2020.05.23 |
AsyncQueryHandler 와 Loader (0) | 2019.09.08 |
Asynchronization Task (0) | 2019.09.08 |