본문 바로가기
Android

[안드로이드] 안드로이드 앱 성능 개선 (feat. 네이버 테크 콘서트)

by Sky Titan 2020. 10. 19.
728x90

※ 출처 : 2020 네이버 테크 콘서트

 

01. 100만 달러짜리 빠른 앱을 만드는 비법 전수

NAVER Engineering | 발표자: 옥수환 (NAVER) * 개요 안드로이드 앱이 고도화될수록 레이아웃은 복잡해지고, 성능은 떨어지기 마련입니다. 하지만, 아무도 느리고 버벅거리는 앱을 원하지 않습니다. 이 �

tv.naver.com

앱이 버벅거리는 이유

  • 앱은 16ms 이내에 프레임을 업데이트 해야한다.
  • 하지만 16ms 이내에 프레임을 업데이트 하지 못한다면 앱에서 업데이트를 포기하게 되는데 이 현상을 '프레임 드랍' 이라고 부른다.
  • 프레임 드랍이 곧 사용자에게는 앱이 버벅거리는 것으로 보이는 것이다.

 

안드로이드의 렌더링 과정

  • 안드로이드에선 CPU가 가지고 있는 폴리곤, 텍스쳐를 GPU를 전달하고 전달한 데이터를 보존할 때, OpenGL/ES 라이브러리를 활용한다.
  • 렌더링 성능의 핵심은 GPU의 메모리 적재된 데이터 관리이다.
  1. View가 CPU에 의해 폴리곤-메시, 텍스처로 변환된다.
  2. 변환된 데이터를 OpenGL로 CPU에서 GPU로 전달한다.
  3. 레스터화를 거쳐서 화면에 나타난다.

 

View의 성능을 끌어올리는 방법

1. OverDraw 줄이기

  • 오버드로우 : 같은 픽셀에 여러 번 덧칠하는 것을 의미한다.
  • 오버드로우를 줄여서 불필요한 GPU연산을 줄인다.
  1. 부모 뷰, 자식 뷰의 중첩되는 배경색을 제거한다.
  2. 투명도 사용을 줄인다.
    1. 같은 색으로 보여도 투명도를 사용하면 내부적으로 연산이 더 필요하다.

 

2. View의 간소화 및 갱신 빈도 줄이기

view의 생명주기

  • onDraw() 등과 같은 view의 생명주기 메서드들은 여러 번 호출 될 수 있기 때문에 생명주기 메서드에서 메모리를 할당, 초기화하는 작업은 하지 않는다.
  • onDraw(), onLayout(), onMeasure() 메서드를 자주 호출하지 않는다.
  • Invalidate(), requestLayout() 의 호출을 자제한다.

 

3. ConstraintLayout

  • 기본적으로 레이아웃 계층이 깊을수록 뷰를 순회하며 연산량이 증가한다.
  • ConstraintLayout을 사용함으로써 레이아웃 계층을 평탄화하여 불필요한 레이아웃의 깊은 중첩을 방지할 수 있다. 

 

4. ViewStub 사용으로 느리게 초기화하기

  • ViewStub을 이용하여 불필요한 뷰의 전개를 제어하여 성능을 개선한다.

 

5. RecyclerView 성능 향상

  1. 아이템 갱신 최소화
    1. Adapter.notifyDataSetChanged()를 호출하면 전체 아이템을 갱신하므로 불필요한 갱신이 일어난다.
    2. notifyItemChanged()와 같이 변경된 아이템만 갱신함으로써 불필요한 갱신을 줄인다.
  2. DiffUtil 사용
    1. 두 리스트의 차이를 계산하여 변경된 부분만 갱신하도록 해주는 클래스
  3. RecyclerView.setHasFixedSize(true) 사용
    1. RecyclerView의 전체 크기를 미리 알고 있다면 RecyclerView가 갱신될 때 크기가 변경되어야하는지 확인하는 작업을 건너뛸 수 있다.
  4. RecyclerView.setItemViewCacheSize(int n)사용
    1. 아이템 뷰가 pool로 들어가기전 유지되는 캐시 사이즈를 결정한다.
    2. 아이템 뷰가 화면 밖으로 나갔다가 다시 나타날 때, onBindViewHolder()의 호출을 줄일 수 있다.
  5. setRecycledViewPool(RecyclerViewPool) 사용
    1. RecyclerView가 중첩되어 있는 경우 RecyclerView 간의 ViewPool을 공유하여 성능을 개선시킨다.
    2. 바깥 RecyclerView 어댑터의 onCreateViewHolder 메서드에서 바깥 RecyclerView의 ViewPool을 안쪽 RecyclerView로 넘겨주면 된다.
  6. setHasStableIds(true) 사용
    1. 아이템에 고유 식별자 (ID)를 부여하여 이미 바인딩 된 적이 있는 아이템에 대해서는 재 바인딩이 되지 않도록 한다. (onBindViewHolder 호출 막음)
    2. 이 때 어댑터의 getItemId 메서드를 오버라이딩하여 아이템의 id를 반환하도록 한다.
728x90

'Android' 카테고리의 다른 글

[안드로이드] BroadcastReceiver  (0) 2020.10.21
[안드로이드] Context  (0) 2020.10.21
[안드로이드] EditText 밑줄 색 바꾸기  (0) 2020.10.12
[안드로이드] statusBarColor 바꾸기  (0) 2020.10.10
[안드로이드] LiveData  (0) 2020.09.15

댓글