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

송규빈·2022년 10월 4일
0
post-thumbnail

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와 구현 방식은 비슷할것이라고 생각한다.

profile
🚀 상상을 좋아하는 개발자

0개의 댓글