前言
当你的App使用更多的CPU时候会造成手机电池寿命的消耗,还可能引起启动App 使用CPU的飙升。因此这篇文章在图片处理技巧上怎么减少CPU和GPU以及内存的使用。
图片加载
当UIImage,加载图片然后渲染到UIImageView中时候这个过程如下图
中间重要的阶段解码
-
缓冲区是有一系列大小结构相同的元素组成
-
数据缓冲区 存储图片的一些信息。图片大小,图片本身的内容,这些内容以jgp或者png编码,但是不描述每个像素
-
图片缓冲区表示图片在内存中的表示。描述每个像素的透明度和颜色。
图片缓冲区,大小和image size成正比。当你App视图层级结构变化,那么会重新渲染到帧缓冲区,在60-120hz, -
我们需要每个像素的数据填充图像的帧缓冲区,帧缓冲区的大小是数据缓冲区的大小,这个过程要解码,把这些编码的数据转化为每个像素的图像信息,然后从数据缓冲区复制到图像帧缓冲区过程中,UIKit会进行缩放复制。下图这个过程
解码的过程遇到的问题
有大量内存碎片,因为渲染的过程内存不会使用那么多帧缓冲区和图片实际大小没关系。CPU飙升,全局CPU飙升间接影响别人的App。
向下采样技术解决
UIImageView显示的图片比实际小,CoreAnimation负责缩小,其实就是把原始图像缩小到我们实际显示的大小,大量节省内存
如果滚动视图一直滚动然后没有马上提供给帧缓冲区渲染到控件上就会卡顿。
我们通过其他技术进行处理
-
prefeching
-
后台解码下载
-
GCD全局队列可能造成线程爆炸。GCD太多线程不断切换会浪费很多CPU,我们用一个串行队列中
绘制的流程
其实都是基于CALayer显示,UIKit做绘制渲染。
网友评论