參考:
[ WWDC2018 ] - 深入解析iOS內存 iOS Memory Deep Dive
[ WWDC2018 ] - 圖像最佳實踐 Image and Graphics Best Practices
談談 iOS 中圖片的解壓縮
圖片原理小科普
不管是 JPEG 還是 PNG 圖片,都是一種壓縮的位圖圖形格式。
要在屏幕上渲染出圖片,必須將壓縮后的數據進行解碼,拿到原始像素數據,才能進行后續(xù)繪制操作。
而解壓過程是一個大量占用CPU資源的工作。
原始像素數據大小和圖片文件大小無關,和圖片尺寸正相關。
原始像素數據大小 = 圖片像素長 * 圖片像素寬 * 像素格式。
圖片加載處理
- [UIImage imageNamed:@""]
常用與加載Assets.xcassets內的小圖片嗎,會有緩存。
- [UIImage imageWithContentsOfFile:path]
常用語加載文件夾內圖片,無緩存。
- ImageIO的方式
加載:在Decode前插入創(chuàng)建縮略圖的過程。即對image進行預處理,采用縮小解碼后Image Buffer的size的方式,減少內存的占用。
縮放:ImageIO 能夠在不產生 dirty memory 的情況下讀取到圖片尺寸和元信息,其內存損耗等于縮減后的圖片尺寸產生的內存占用。
實踐對比
測試:iPhone7 11.2.6系統下,Xcode9.4
本地文件148KB的jpg圖片:
通過[UIImage imageWithContentsOfFile:path]加載內存占用為15.7MB左右,
通過ImageIO加載,內存占用為13.2MB左右
對比sdwebImage:
加載本地圖片4張:
通過SDWebImage,內存占用為15MB左右
通過ImageIO加載,內存占用為14MB左右
加載網絡圖片:
通過SDWebImage,內存占用為14MB左右
通過ImageIO加載,內存占用為14.5MB左右
注意
API為CF庫,需注意內存的釋放問題。
最佳實踐:創(chuàng)建串行隊列,在串行隊列內通過ImageIO獲取處理圖片,切回主隊列進行UI更新。