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

+ Recent posts