2015. 8. 1.

Improving Layout Performance (#1. Optimizing Layout Hierarchies)

좀 더 나은 레이아웃의 성능을 위한
#1. layout hierarchies

참고문서는 아래 공식문서를 참고하였다.






Use Hierarchy View

1. AndroidStudio menu/ Tools / Android Device Monitor
2. add Menu
3. select “Hierarchy View”

위 순서로 hierarchy view 를 open한다.

android studio 에서 제공해주는 hierarchy view tool을 사용하게되면 아래의 장점들이 있다.
  • Layout Hierarchy List
  • Layout ID
  • UI Structure
  • The timing for rendering(measure,layout,draw) 





밑 그림과 같은 Layout을 LinearLayout으로 구성하게되면


 아래와 같이 layout_weight를 사용하여 코드를 작성할 수 있다.




위 코드에 대한 아래 hiearachy 를 살펴보면
두개의 계층으로 이루어진 것을 볼 수 있다.

이 코드의 rendering time은

Measure: 0.977ms
Layout: 0.167ms
Draw: 2.717ms



공식문서에서는 


LinearLayout that use the layout_weight parameter can be especially expensive as each child needs to be measured twice.

특히 LinearLayout 의 layout_weight parameter를 사용하는 경우 각 자식은 두번의 Measure pass가 필요로하기때문에 더욱 많은 비용이 소모된다

라고 말하고 있다. 




Measure pass는 무엇일까?
저번 포스팅때 "View가 그려지는 순서" 에 대해서 이야기를 해보았는데
그 순서를 안다면 , 그리고 layout_weight의 특성을 잘 알고 있다면 이해하기가 쉽다.

일단 layout_weight는 단순히 비율을 나누어 공간을 차지하는 것이 아니다.
내 부모의 view가 그려지고 나서 남은 공간이 얼마만큼인지, 
다른 View들이 그려지고 나서 다시한번 남은공간도 계산하고 그리고나서 자기자신을 그린다.

View가 그려지는 순서를 보자.
1. view의 수치를 측정해서 저장한다.(쉽게 말하자면 width, height 값을 측정하여 저장)
2. layout의 left,right,top,bottom 즉,그려질 위치를 계산.

그리고

이렇게 자신들의 공간을 먼저 다 계산한 후에 남는 공간에 weight에 맞게 가져가려고 또 계산하게된다.







RelativeLayout을 사용하여 code를 짠다면
계층도 하나를 줄일 수 있을뿐더러 layout_weight을 사용하지않게되어
중첩된 계산을 하지않아도된다.


아래는  RelativeLayout으로 짠 hierarchy 이다.
rendering time은

Measure: 0.598ms
Layout: 0.110ms
Draw: 2.146ms




하나의 계층으로 단순화 되었으며 
속도의 차이는 거의 없지만 
복잡한 레이아웃 코딩을 했을 때는 이야기가 달라진다.


LinearLayout의 무자비한 사용과 layout_weight의 남발은 자제하도록 하자.
특히 ListView / GridView에서는 더더욱.



댓글 없음:

댓글 쓰기