参考:
[ WWDC2018 ] - 深入解析iOS内存 iOS Memory Deep Dive
[ WWDC2018 ] - 图像最佳实践 Image and Graphics Best Practices
谈谈 iOS 中图片的解压缩
图片原理小科普
不管是 JPEG 还是 PNG 图片,都是一种压缩的位图图形格式。
要在屏幕上渲染出图片,必须将压缩后的数据进行解码,拿到原始像素数据,才能进行后续绘制操作。
而解压过程是一个大量占用CPU资源的工作。
原始像素数据大小和图片文件大小无关,和图片尺寸正相关。
原始像素数据大小 = 图片像素长 * 图片像素宽 * 像素格式。
图片加载处理
- [UIImage imageNamed:@""]
常用与加载Assets.xcassets内的小图片吗,会有缓存。
- [UIImage imageWithContentsOfFile:path]
常用语加载文件夹内图片,无缓存。
- ImageIO的方式
加载:在Decode前插入创建缩略图的过程。即对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库,需注意内存的释放问题。
最佳实践:创建串行队列,在串行队列内通过ImageIO获取处理图片,切回主队列进行UI更新。