图片的显示过程

iOS从磁盘加载一张图片,使用UIImageVIew显示在屏幕上,需要经过以下步骤:(加载->解码->渲染)

                    1、根据URL从磁盘中取出图片数据

                    2、生成UIImageView,把图像数据复制给UIImageView,(imageView.image = image )

                    3、如果图像数据为未解码的PNG/JPG,解码为位图数据; 

                    4、CATransaction捕获到UIImageView layer树的变化

                    5、主线程Runloop提交CATransaction,开始进行图像渲染;         

 

为什么要进行图片的解码?

              答:不管是JPEG还是PNG图片都是一种压缩的位图图形格式,只不过PNG是无损压缩,并且支持alpha通道,而JPEG图片则是有损压缩,可以指定0-100%的压缩比,因此,在将磁盘中的图片渲染到屏幕之前,必须要先得到图片的原始像素数据,才能执行后续的绘制操作。 解码是一个计算量较大的任务,且需要CPU来执行;并且解码出来的图片体积与图片的宽高有关系,而与图片原来的体积无关。  SDWeabImage里将解码放到后台线程执行

             https://www.jianshu.com/p/e9843d5b70a2

             https://www.jianshu.com/p/39b91ecaaac8

             https://www.jianshu.com/p/f750196a264a

 

重新认识Core Animation:

                 Core Animation 在 RunLoop 中注册了一个 Observer,监听了 BeforeWaiting 和 Exit 事件。这个 Observer 的优先级是 2000000,低于常见的其他 Observer。当一个触摸事件到来时,RunLoop 被唤醒,App 中的代码会执行一些操作,比如创建和调整视图层级、设置 UIView 的 frame、修改 CALayer 的透明度、为视图添加一个动画;这些操作最终都会被 CALayer 捕获,并通过 CATransaction 提交到一个中间状态去(CATransaction 的文档略有提到这些内容,但并不完整)。当上面所有操作结束后,RunLoop 即将进入休眠(或者退出)时,关注该事件的 Observer 都会得到通知。这时 CA 注册的那个 Observer 就会在回调中,把所有的中间状态合并提交到 GPU 去显示;如果此处有动画,CA 会通过 DisplayLink 等机制多次触发相关流程

 

自己实现异步加载图片:

                https://www.jianshu.com/p/505585e1109e

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值