티스토리 뷰

iOS

[iOS] Images 이미지 메모리 관련

Kim_Baechu 2022. 4. 19. 18:53

WWDC2018 iOS Memory Deep Dive내용중 일부입니다.

https://developer.apple.com/videos/play/wwdc2018/416/?time=1405 

 

iOS Memory Deep Dive - WWDC18 - Videos - Apple Developer

Discover how memory graphs can be used to get a close up look at what is contributing to an app's memory footprint. Understand the true...

developer.apple.com

이미지는 Dimension과 관련있지 파일사이즈와 관련있는 것이 아닙니다.

2048 * 1536이면서 파일사이즈는 590kb인 이 이미지를 아이패드 앱의 배경화면으로 쓰려면 얼마나 메모리가 들까요.

 

 

10MB나 듭니다.

픽셀당 4바이트씩 들기 떄문입니다.

 

 

이미지를 로드하고 GPU가 읽을 수 있게 Decode해야합니다.

여기서 10MB가 필요합니다.

 

이미지 포맷에 여러가지가 있습니다.

SRGB에서는 R G B에 알파까지 4바이트가 필요합니다.

Wide format은 픽셀 당 8바이트씩 필요합니다.

Luminance(휘도, 밝기)와 알파값에는 2바이트가 들어갑니다.

알파만 있는경우 1바이트가 필요합니다.

메모리 사용을 줄이기 위해 적절한 포맷을 사용해야합니다.

UIGraphicsBeginImageContextWithOptions 대신에 UIGraphicsImageRenderer를 사용하세요.

UIGraphicsBeginImageContextWithOptions는 항상 픽셀당 4바이트를 쓰는데 UIGraphicsImageRenderer
iOS12부터 적절한 포맷을 선택해줍니다.

 

 

기존 방식의 드로잉입니다.

검정 Path를 그리는데 4바이트 형식을 사용하고 있습니다.

 

새로운 API에서는 1바이트를 사용합니다.

틴트컬러를 바꿔서 색을 바꿀 수 있습니다.

추가적인 메모리 cost없이 가능합니다.

 

 

이미지 다운샘플링 관련입니다.

UIImage는 리사이징에 메모리를 많이 사용합니다.

메타데이터를 사용해서 메모리를 적게 사용할 수 있습니다.

 

더 작은 rect를 그리기위해 UIImage를 사용하고 있습니다.

저수준 API를 사용하기 때문에 몇가지 파라미터를 세팅해야합니다.

CGImageSourceCreateThumbnailAtIndex를 사용하여 이미지를 생성합니다.

CGImage를 만들었고, 훨씬 작은 이미지를 가지고 있고, 이전 코드보다 50% 빠릅니다.

댓글
공지사항