22. 1. Button이 CPU에 의해 폴리곤-메시와 텍스처로 변환
2. 변환된 데이터는 OpenGL에 의해 CPU에서 GPU로 전달
3. 래스터화를 거쳐 화면에 나타남
Button이 화면에 나타나는 과정
즉, 렌더링 성능의 핵심은 GPU의 메모리 적재된 데이터 관리!
24. 오버드로우?
오버드로우란 같은 픽셀에 여러번 덧 칠하는 것을 의미한다.
오버드로우를 줄이면 불필요한 GPU리소스를 줄이고
퍼포먼스를 끌어올릴 수 있다.
1. Overdraw란?
25. 불필요한 배경 제거 또는 중첩되는 색상의 배경 제거하면 오버드로우를 방지하여 성능을 개선할 수 있다.
1.1 오버드로우 줄이기 - 중첩된 배경 제거
<LinearLayout
android:id="@+id/parent"
android:width="match_parent"
android:height="match_parent"
android:background=“@android:color/black”>
<LinearLayout
android:id="@+id/child"
android:width="match_parent"
android:height="wrap_content"
android:background=“@android:color/black”>
...
</LinearLayout>
</LinearLayout>
27. 1.2 오버드로우 줄이기 - 투명도 사용 삼가하기
Grey Black Alpha 0.5f+
부가적인 연산 필요
Vs
28. - onDraw() 등 생명주기 메서드에서 메모리를 할당하거나 초기화하는 작업
은 삼가한다.
- onDraw(), onMeasure(), onLayout() 메서드가 자주 호출 되지 않도록
한다.
- 무분별한 invalidate(), requestLayout() 호출 삼가하기
2. View의 간소화 및 갱신 빈도 낮추기
32. ViewStub 특징
- 초기화 지연
- 경량화된 View로 보이지 않고, 아무것도 그리지 않음
- 복잡한 레이아웃에서 사용
4. ViewStub 사용으로 느리게 초기화하기
ViewStub
View
ViewStub
33. Adapter.notifyDataSetChanged() : 호출하여 전체를 갱신하는 대신 특정 아이템만 갱신하도록 한다.
5.1 RecyclerView 퍼포먼스 향상시키기 - 아이템 갱신 최소화하기
부분적으로 아이템들을 갱신하는 메서드
- notifyItemChanged
- notifyItemInserted
- notifyItemRemoved
- notifyItemMoved
- notifyItemRangeChanged
- notifyItemRangeInserted
- notifyItemRangeRemoved
34. DiffUtil이란?
두 리스트를 차이를 계산하고 변경된 부분만 갱신하도록 도와주는 유틸클래스
5.2 RecyclerView 퍼포먼스 향상시키기 - DiffUtil 사용하기
반드시 구현해야하는 DiffUtil.Callback 메소드
getOldListSize : 이전 리스트의 사이즈를 반환
getNewListSize : 새로운 리스트의 사이즈를 반환
areItemsTheSame : 두 아이템이 같은 아이템인지 검사한다.
areContentsTheSame : 두 아이템의 내용이 같은지 검사한다.
35. RecyclerView.setHasFixedSize(true) :
Adpater 내용이 변경 될 때 RecyclerView가 전체 레이아웃을 갱신하지 않도록 할 수 있다.
5.3 RecyclerView 퍼포먼스 향상시키기 - setHasFixedSize(true) 호출하기
//RecyclerView 내부 코드
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
...
if (mHasFixedSize) {
mLayout.onMeasure(mRecycler, mState, widthSpec, heightSpec);
return;
}
...
}
38. Adapter.setHasStableIds(true):
아이템에 대해 고유 식별자를 부여하여 동일한 아이템에 대해 onBindViewHolder 호출을 방지하여 성능을 개선한다.
5.6 RecyclerView 퍼포먼스 향상시키기 - setHasStableIds(true) 호출하기
public class MyAdapter extends RecyclerView.Adapter<...> {
...
@Override
public long getItemId(int position) {
return viewModels.get(position).getId();
}
}