Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

android gpu 렌더링 본문

android

android gpu 렌더링

개발자가되고싶어 2021. 7. 26. 15:36
android gpu 렌더링

 

이번엔 android gpu 렌더링에 대해 알아보겠습니다.

 

gpu 렌더링이란?

android 에서 ui 작업은 main thread에서 처리가 됩니다. 이러한 ui 작업처리는 사용자에게 직접적인 영향을 미치게 됩니다. 

gpu 렌더링 도구는 이러한 활동을 시각화 하여 표현해 줍니다.

 

활성화 방법

1. 기기의 설정 -> 개발자 옵션

2. 모니터 카테고리 -> 프로필 GPU 렌더링 또는 프로필 HWUI 렌더링 -> 화면에 막대로 표시 설정

 

출력 검사

  • 가로축의 각 세로 막대는 프레임을 나타내며 각 세로 막대의 높이는 프레임을 렌더링하는데 소요된 시간(ms)을 나타냅니다.
  • 녹색 가로선은 16ms를 나타냅니다. 초당 60프레임을 달성하려면 각 프레임의 새로막대가 이 선 아래 있어야 합니다.

https://developer.android.com/topic/performance/rendering/inspect-gpu-rendering?hl=ko

좀 더 자세한 설명은 위의 developer 사이트에서 확인하실 수 있습니다.

 

이외의 설명들은 developer 사이트를 참조 부탁드리며

저는 해당 gpu 렌더링 도구를 이용하여 성능측정을 한번 해보고자 합니다.

측정에는 recyclerview를 이용하여 recyclerview의 notifyDataSetChanged() 메소드와 diffUtil을 사용하여 비교합니다.

측정에 사용된 ui는 중복선택이 가능한 라디오 버튼을 이용한 recyclerview 입니다.

 

Recyclerview notifyDataSetChanged

notifyDataSetChanged()메소드는 우리에게 꽤나 편리함을 가져다 줍니다.

어떠한 상황에서든 무적의 notifyDataSetChanged() 메소드만 호출한다면 우리는 보장된 결과값을 기대할 수 있습니다. 

하지만 notifyDataSetChanged() 메소드는 그다지 효율적이지 않습니다. 최초의 상황에서 모든 것을 그려야 할때야 문제가 없겠지만 위의 예시의 ui만 보더라도 라디오 버튼을 하나 누를때마다 화면의 전체 갱신이 일어나게 됩니다.

notifyItemChanged() 특정 부분만 갱신되는 메소드도 있지만 여기에선 무시하겠습니다.

 

위의 상황을 gpu 렌더링 툴을 이용하여 확인 해 보겠습니다.

위의 그래프는 라디오버튼을 눌렀을 때마다 발생되는 프레임이 표시된 것 입니다.

이미 developer에서 설명해주는 초록색 가로선(16ms)은 훌쩍 넘어 화면을 뚫을 기세인것을 확인할 수 있습니다.

이처럼 notifyDataSetChanged()메소드는 상황에 따라서 그다지 좋은 성능을 내지 못한다는 것을 알 수 있습니다.

위와같은 상황에서 버튼이 눌리는 찰나의 순간이지만 사용자는 매끄럽지 않다는 것을 생각하고 있을지도 모릅니다.

 

DiffUtil

diffutil은 notifyDataSetChanged() 메소드에 비해서는 약간의 신경을 써 주어야 하는 유틸리티 클래스 입니다.

아이템의 변경을 알 수 있는 key 값과 key는 같으나 내용의 변경을 알 수 있는 contents 값만 있다면 이용할 수 있는 유용한 클래스 입니다.

위의 그래프가 diffUtil을 사용했을 때의 상황입니다. 사실 테스트해보고 꽤나 놀랐습니다. notifyDataSetChanged()와 이정도의 차이가 날줄은 몰랐습니다.

 

 

구글의 친절함에 다시한번 박수를 보낼 수 있는 시간이였습니다. 

해당 툴은 꽤나 유용하게 사용될 것 같습니다.

읽어주셔서 감사합니다.

'android' 카테고리의 다른 글

android ViewPager custom animation  (0) 2021.09.10
android Jetpack  (0) 2021.08.21
android RecycledViewPool  (0) 2021.07.24
android intent bundle  (0) 2021.07.22
android launchMode  (0) 2021.07.13