728x90
※ 출처 : 2020 네이버 테크 콘서트
앱이 버벅거리는 이유
- 앱은 16ms 이내에 프레임을 업데이트 해야한다.
- 하지만 16ms 이내에 프레임을 업데이트 하지 못한다면 앱에서 업데이트를 포기하게 되는데 이 현상을 '프레임 드랍' 이라고 부른다.
- 프레임 드랍이 곧 사용자에게는 앱이 버벅거리는 것으로 보이는 것이다.
안드로이드의 렌더링 과정
- 안드로이드에선 CPU가 가지고 있는 폴리곤, 텍스쳐를 GPU를 전달하고 전달한 데이터를 보존할 때, OpenGL/ES 라이브러리를 활용한다.
- 렌더링 성능의 핵심은 GPU의 메모리 적재된 데이터 관리이다.
- View가 CPU에 의해 폴리곤-메시, 텍스처로 변환된다.
- 변환된 데이터를 OpenGL로 CPU에서 GPU로 전달한다.
- 레스터화를 거쳐서 화면에 나타난다.
View의 성능을 끌어올리는 방법
1. OverDraw 줄이기
- 오버드로우 : 같은 픽셀에 여러 번 덧칠하는 것을 의미한다.
- 오버드로우를 줄여서 불필요한 GPU연산을 줄인다.
- 부모 뷰, 자식 뷰의 중첩되는 배경색을 제거한다.
- 투명도 사용을 줄인다.
- 같은 색으로 보여도 투명도를 사용하면 내부적으로 연산이 더 필요하다.
2. View의 간소화 및 갱신 빈도 줄이기
- onDraw() 등과 같은 view의 생명주기 메서드들은 여러 번 호출 될 수 있기 때문에 생명주기 메서드에서 메모리를 할당, 초기화하는 작업은 하지 않는다.
- onDraw(), onLayout(), onMeasure() 메서드를 자주 호출하지 않는다.
- Invalidate(), requestLayout() 의 호출을 자제한다.
3. ConstraintLayout
- 기본적으로 레이아웃 계층이 깊을수록 뷰를 순회하며 연산량이 증가한다.
- ConstraintLayout을 사용함으로써 레이아웃 계층을 평탄화하여 불필요한 레이아웃의 깊은 중첩을 방지할 수 있다.
4. ViewStub 사용으로 느리게 초기화하기
- ViewStub을 이용하여 불필요한 뷰의 전개를 제어하여 성능을 개선한다.
5. RecyclerView 성능 향상
- 아이템 갱신 최소화
- Adapter.notifyDataSetChanged()를 호출하면 전체 아이템을 갱신하므로 불필요한 갱신이 일어난다.
- notifyItemChanged()와 같이 변경된 아이템만 갱신함으로써 불필요한 갱신을 줄인다.
- DiffUtil 사용
- 두 리스트의 차이를 계산하여 변경된 부분만 갱신하도록 해주는 클래스
- RecyclerView.setHasFixedSize(true) 사용
- RecyclerView의 전체 크기를 미리 알고 있다면 RecyclerView가 갱신될 때 크기가 변경되어야하는지 확인하는 작업을 건너뛸 수 있다.
- RecyclerView.setItemViewCacheSize(int n)사용
- 아이템 뷰가 pool로 들어가기전 유지되는 캐시 사이즈를 결정한다.
- 아이템 뷰가 화면 밖으로 나갔다가 다시 나타날 때, onBindViewHolder()의 호출을 줄일 수 있다.
- setRecycledViewPool(RecyclerViewPool) 사용
- RecyclerView가 중첩되어 있는 경우 RecyclerView 간의 ViewPool을 공유하여 성능을 개선시킨다.
- 바깥 RecyclerView 어댑터의 onCreateViewHolder 메서드에서 바깥 RecyclerView의 ViewPool을 안쪽 RecyclerView로 넘겨주면 된다.
- setHasStableIds(true) 사용
- 아이템에 고유 식별자 (ID)를 부여하여 이미 바인딩 된 적이 있는 아이템에 대해서는 재 바인딩이 되지 않도록 한다. (onBindViewHolder 호출 막음)
- 이 때 어댑터의 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 |
댓글