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가 메모리를 많이 잡아먹는 이유
- 즉시 표시해야 하므로, iOS가 파일을 읽자마자 완전히 풀어(RGBA) 둡니다.
- Retina 스케일(@2x·@3x)이면 픽셀 수가 4~9배로 늘어남.
- 스크롤 뷰에 여러 장 놓으면 풀린 버퍼들이 중복으로 남아 있을 수 있음.
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로 보관
정리:
- 디스크 용량은 “접힌 옷”, 메모리 용량은 “다려서 펼친 옷”.
- 보여주려면 일단 펼쳐야 하니 커질 수밖에 없다.
- 효율적 표시를 위해 “필요한 만큼만 펼치고, 안 쓰면 접어 두기”가 핵심!
반응형