[WWDC 2018] iOS Memory Deep Dive (2/2)
WWDC 2018 iOS Memory Deep Dive (1/2)
WWDC 2018 iOS Memory Deep Dive (2/2)
Images
이미지에서 메모리 사용은 파일 크기가 아니라 이미지의 크기와 관련이 있다는 것입니다.
why is it so much larger?
SRGB Format
픽셀 당 8 비트이므로 빨강은 1 바이트, 초록은 1 바이트, 파랑은 1 바이트, 알파 구성 요소로 총 4byte가 필요합니다.
Wide format
iOS 하드웨어는 넓은 형식을 렌더링 할 수 있습니다.
이제 표현력있는 색상을 얻으려면 와이드 포맷으로 픽셀 당 2 바이트가 필요하므로 이미지 크기를 두 배로 늘립니다
4 *2 = 8 byte
하지만 더 작아질 수도 있습니다.
Gray와 Alpha 값만 저장합니다.
Alpha 8 format
또한 1byte 만 사용할 수 있습니다.
1Byte ~ 8Byte 까지의 단계가 있습니다.
Picking the right format
UIGraphicsBeginImageContextWithOptions 은 SRGB format 이기 때문에 4Byte 를 차지합니다.
iOS 10 부터는 UIGraphicsImageRenderer 를 사용하면 자동으로 최적의 Format를 선택합니다.
(X) Circle via UIGraphicsImageContext
픽셀당 4Byte 를 할당하기 때문에 사용하면 안됩니다.
(O) Circle via UIGraphicsImageContext
픽셀당 1Byte 를 할당하기 때문에 사용해야 합니다.
Downsampling
UIImage
썸네일처럼 만들려면 축소해야합니다.
우리가 원하지 않는 것은 다운 스케일링을 위해 UIImage를 사용하는 것입니다.
실제로 UIImage를 사용하여 그리면 내부 좌표 공간 변환으로 인해 성능이 약간 떨어집니다.
앞에서 보았 듯이 메모리의 전체 이미지를 압축 해제합니다.
ImageIO
실제로 이미지를 다운 샘플링 할 수 있으며 결과 이미지의 Dirty meomry 비용만 지불하도록 스트리밍 API를 사용합니다
Image size with UIImage
Image size with ImageIO
UIImage 코드보다 약 50 % 빠릅니다.
Optimizing when in the background
viewWillAppear 및 viewDidDisappear 코드 또는 콜백과 같은 기능을 활용하면 메모리 공간을 더 작게 유지할 수 있습니다.
Unloading resources on foreground/background 1
Unloading resources on foreground/background 2
Demo
NASA에서 얻은 태양계의 고해상도 이미지로 시작하며 다른 필터를 적용 할 수 있습니다.
우선 이 게이지는 2 기가 바이트의 메모리가있는 장치로 측정합니다.
모든 장치에 많은 메모리가있는 것은 아닙니다.
이 코드가 1 기가 바이트의 메모리 만있는 기기에서 실행되고 있다면 운영 체제에 의해 앱이 이미 종료되었을 가능성이 높습니다.
둘째, 운영 체제는 앱을 종료 할 때를 설계 할 때 앱이 사용하는 메모리 양뿐만 아니라 운영 체제에서 진행중인
다른 메모리도 사용하지 않습니다.
우리가 아직 빨간색에 있지 않다고해서 우리가 종료 될 위험이 없다는 것을 의미하지는 않습니다.
셋째, 이것은 사용자에게 끔찍한 경험을 나타냅니다.
실제로 사용량 비교 차트를 보면 다른 프로세스에 0KB의 메모리가 있음을 알 수 있습니다.
앱에 대한 공간을 만들기 위해 운영 체제에 의해 모두 종료되었기 때문입니다.
참조:
https://medium.com/better-programming/reducing-your-apps-memory-footprint-b7afcb9f3749
https://medium.com/better-programming/ios-advanced-memory-debugging-to-the-masses-24d25852a91c
https://developer.apple.com/videos/play/wwdc2018/416
https://hcn1519.github.io/articles/2018-09/wwdc2018session416