对于UIImageView的优化,无非就是对UIImageView加载图片进行优化,作者本人是看过YYKit、AsycnDispalyKit、SDWebImage、OpenGL ES 之后想着来写这篇文章的,在这里不讲加载网络加载过程(因为篇幅太大,还得准备配图,太麻烦了😂),本文用 swift 语言。
图像渲染的过程
image把一个图片显示在屏幕上,简单点就是分成两部分
第一,CPU把UIImage绘制BitImage(位图)
第二,OpenGL ES 把CPU合成的BitImage转换成纹理,因为GPU处理的单位是texture(纹理),GPU把所有的纹理数据合成渲染的颜色像素数据放入VARM(显示储存器),需要的时候就把显示出来
简单一点就是这样(其实远远不止这些,这里不做过多讲述)
下面这张图会更加明显
image
来说说问题
如果把一张400*400px的图片放入100*100px的UIImageView中造成,在绘制的过程中会对图片的像素进行拉伸/压缩来绘制位图,这个过程是非常耗时,如果你的tableview每个cell有一个或者多个imageview,在加上快速滑动,就会造成掉帧现象
解决方法
1.预合成,提前把400*400px的图片裁剪成100*100px图
2.异步绘制,把位图绘制的操作放入异步线程中去执行,绘制完成之后返回UI线程(主线程)刷新UI(参考YYAsycnDispalyLayer 的实现)
大牛的文章:
网友评论