본문 바로가기

안드로이드

Glide 관찰기 (Feat. 속도, 캐시)

Glide

Glide에 관한 예제는 많이 나와있으니 내가 궁금했던 것들에 적어보고자 한다.

Glide는 Android용 이미지 로딩 라이브러리이다.
'이미지 로딩 라이브러리'하면 Picasso도 생각이 나지만 gif 파일을 지원하지 않고, Glide가 성능적으로 더 좋다는 평이 많아서 Glide를 더 사용하는 것 같다.

Glide가 Android에서 고려하는 것 중 가장 중요하게 생각하는 것은 '속도'와 '버벅거림'이라고 한다.
이것을 정리하면 이미지(들)를 가능한 부드럽고 빠르게 스크롤할 수 있게 하는 것이라고 생각한다.

속도

문서를 봤지만 당연하게도(?) 어떻게 구현되어 있는지는 안 나와있었고, 이미지 로딩이 최대한 빠르고 원활하게 하기 위해 구현한 단계는 나와있었다.

  • 자동 다운 샘플링과 캐싱을 통해 스토리지 오버헤드와 디코딩 시간을 최소화
  • 바이트 배열 및 비트맵과 같은 리소스의 적극적인 재사용으로 GC 최소화
  • 액티비티와 프래그먼트 수명주기를 고려하여 리소스 자동 해제

그래서 직접 구현을 해봤다.

BitmapFactory를 통해 res 폴더에 있는 Resource 파일을 디코딩하여 비트맵을 가져온 후 Bundle에 담아 Handler를 통해 메세지 큐에 넣기 위해 ByteArray로 변환하였다.

여기서 Bitmap 클래스가 Parcelable을 구현하고 있어서 바로 번들에 넣어줘도 되지만, Parcelable은 큰 용량의 데이터는 지양하고 있기 때문에 ByteArray로 변환하였다.


그 후엔 다시 bitmap형태로 변환하여 imageView에 set하였다.

물론 Glide 내부적으로는 로직이 다를 수도 있고, 이러한 로직 구성에 개선이 된 코드로 되어있겠지만 내 생각에는 대략적인 메커니즘은 이런식으로 돌아가지 않을까 생각한다.

캐싱

이미지 캐싱에 쓰이는 전략은 캐시 크기가 한계에 이르면 사용된 지 오래된 순으로 제거하는 LRU eviction을 사용한다고 나와있다.

메모리 캐시, 비트맵 풀, 디스크 캐시가 있고 메모리 캐시에서 사용한다는 LruResourceCache를 들어가서 클래스들의 패키지를 확인해보니 기존 안드로이드에 있는 LruCache 클래스를 사용하는 게 아닌 약간의 변형이 들어간 것 같다.

어쨌든 문서의 설명에서도 그렇고 안드로이드의 LruCache와 구현 방식은 비슷할것이라고 생각한다.

반응형