iOS/iOS

UIImage와 메모리 사용량

ywangnon 2025. 4. 24. 21:27
반응형

📸 이미지는 같은데 용량이 왜 이렇게 다를까?

“갤러리에선 3 MB인데 앱 메모리에서는 30 MB?!”

 

오늘 작업을 하면서 메모리를 너무 많이 차지하는 이슈를 처리하였습니다.

이 작업이 처음에 어려웠던 게 논리상 문제가 없는데, 메모리가 너무 많이 사용되었습니다.

 

계속 메모리 상승하는 부분을 추적하다가 UIImage를 저장하거나 사용하는 곳에서 매우 큰 메모리 상승이 일어나는 것을 보고 찾아보았습니다.

 

PNG·JPG 파일 크기와 UIImage가 차지하는 메모리의 비밀을 아주 쉽게 풀어봅니다.


1. 파일 용량 ≠ 메모리 사용량

상황내부 형식1 픽셀당 바이트1920×1080 이미지 예시

디스크(저장소) PNG·JPG (압축) 0.1 ~ 0.5 B (가변) 약 1 ~ 3 MB
메모리(램) RGBA (비압축) 4 B 1920×1080×4 = ~8 MB
  • 압축 파일은 “지퍼봉투”에 든 상태라 부피가 작습니다.
  • 화면에 띄우려면 모두 꺼내서 펼쳐야 하므로 4배이트짜리 생 픽셀 데이터가 메모리에 올라갑니다.

2. PNG‧JPG는 ‘접어서 넣어 두는’ 기술

  • JPG: 사진처럼 색 변동이 많은 이미지를 대상으로 ‘비손실 + 손실’ 압축.
    • 비슷한 색 블록을 묶고, 보이지 않는 차이는 버림.
  • PNG: 아이콘·UI처럼 단색 면이 많을 때 효율적인 비손실 압축.
    • 반복되는 색 패턴을 짧은 코드로 치환.
      👉 둘 다 “화면에 안 보이는 정보”를 줄이거나 패턴을 재사용해 용량을 줄입니다.

3. UIImage가 메모리를 많이 잡아먹는 이유

  1. 즉시 표시해야 하므로, iOS가 파일을 읽자마자 완전히 풀어(RGBA) 둡니다.
  2. Retina 스케일(@2x·@3x)이면 픽셀 수가 4~9배로 늘어남.
  3. 스크롤 뷰에 여러 장 놓으면 풀린 버퍼들이 중복으로 남아 있을 수 있음.

4. 숫자로 감 잡기

해상도화면(scale)메모리(RGBA)

100×100 px 일반(1×) 100×100×4 B = 40 KB
100×100 pt @2x Retina(2×) = 200×200 px 200×200×4 B = 160 KB
4K 사진 3840×2160 @3x 기기에서 표시 3840×2160×4 B = ~32 MB

압축 JPG로 3 MB짜리 4 K 파일을 띄우면 10배 이상 메모리를 먹을 수 있다는 뜻입니다.


5. 그래서 개발자는 뭘 해야 할까? 한 줄 요약

  • 작게 보일 건 작게 디코딩해서 쓰자 → 썸네일·다운샘플링.
  • 같은 이미지는 공유 캐시로 한 번만 디코딩.
  • 필요 없을 땐 메모리에서 릴리즈(NSCache.totalCostLimit, 메모리 경고 대응).
  • 가능하면 Data 혹은 Path로 보관

정리:

  • 디스크 용량은 “접힌 옷”, 메모리 용량은 “다려서 펼친 옷”.
  • 보여주려면 일단 펼쳐야 하니 커질 수밖에 없다.
  • 효율적 표시를 위해 “필요한 만큼만 펼치고, 안 쓰면 접어 두기”가 핵심!
반응형