기어가더라도 제대로
[ios-swift] GIF 다루기 본문
배경 설명
Gif를 로드하는 UIImageView에서 Gif 한 건 당 메모리가 50mb 씩 소요되는 현상 발생
사건 분석
이미지 로드 라이브러리로 KingFisher를 사용하고 있으나 여기에 적절한 녀석이 없을 줄 알고 구글링을 해서 gif image loader를 가져와서 사용했다. 근데 사실 KingFisher에서 제공하고 있는 녀석이 있었다.
KingFisher에서 제공하는 간편한 모델 그 녀석은 CPU을 좀 쓰긴하는데 크게 문제는 없어 보였다.
Gif 사용법 - Image 처럼 처리
@IBOutlet weak var banner: UIImageView!
banner.kf.setImage(
with: URL(string: url),
placeholder: UIImage(named: "camp_default"),
options: [
.scaleFactor(UIScreen.main.scale),
.cacheOriginalImage
]
)
이 코드는 image 처리하는데는 문제가 없는데, gif를 처리하는데는 문제가 발생했다.
Gif 한 건 당 메모리가 50mb 씩 소비한다.
Gif 사용법 - KingFisher.AnimatedImage

// 변경 전
@IBOutlet weak var banner: UIImageView!
// 변경 후
@IBOutlet weak var banner: AnimatedImageView!
메모리를 1~2mb 정도 먹고 CPU 사용량이 8~9% 정도 증가함
KingFisher에서 제공하는 gif 처리에 최적화된 뷰를 사용하기만 하면 되서 간편하다. 저 선언부 말고는 바뀐게 없다. 그치만 게시글마다 gif를 올린다고하면 앱이 평균 cpu 사용량이 100%가 넘을 가능성이 있어서 잠재적인 문제가 발생할 수 있다. 새로운 방법을 찾아야 했다.
Gif 사용법 - ImageIO

이미지를 프레임단위로 누적해서 인코딩하는 방식을 인터레이싱이라고 부르는데, 이를 활용하는 방법이다.
전체 데이터를 프레임의 크기와 지속시간등으로 그 때 그 때 필요한 만큼 인코딩을 해서 보여주는 방식
비동기적으로 작업을 수행하고, 계산된 이미지나 원본 이미지를 캐싱할지 옵션에서 선택할 수 있다. 이 방식으로 하니 많은 리소스가 들지 않았다. 약 메모리 1~2mb를 소비하고, 순간적으로 높은 CPU 사용량을 보이는데 곧 정상범위로 내려온다. 자세한 코드는 [1] 주석을 참조하세요.
참조
'Swift - 더 나아가기' 카테고리의 다른 글
[iOS-더 나아가기] withTaskGroup - 동시적으로 async 코드 블럭 실행 (0) | 2023.02.02 |
---|