美文网首页面试宝点
SDWebImage 中的图片解码

SDWebImage 中的图片解码

作者: ForestSen | 来源:发表于2020-07-10 09:16 被阅读0次

为什么图像在显示到屏幕上之前要进行解码

一般我们使用的图像是JPEG/PNG,这些图像数据不是位图,而是是经过编码压缩后的数据,需要线将它解码转成位图数据,然后才能把位图渲染到屏幕上。

当你用 UIImage 或 CGImageSource 的那几个方法创建图片时,图片数据并不会立刻解码。图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 GPU 前,CGImage 中的数据才会得到解码。这一步是发生在主线程的,并且不可避免。

iOS默认是在主线程解码,所以SDWebImage将这个过程放到子线程了。
同时因为位图体积很大,所以磁盘缓存不会直接缓存位图数据,而是编码压缩后的PNG或JPG数据。

图片加载的工作流

概括来说,从磁盘中加载一张图片,并将它显示到屏幕上,中间的主要工作流如下:

  1. 假设我们使用 +imageWithContentsOfFile: 方法从磁盘中加载一张图片,这个时候的图片并没有解压缩;

  2. 然后将生成的 UIImage 赋值给 UIImageView ;

  3. 接着一个隐式的 CATransaction 捕获到了 UIImageView 图层树的变化;

  4. 在主线程的下一个 run loop 到来时,Core Animation 提交了这个隐式的 transaction ,这个过程可能会对图片进行 copy 操作,而受图片是否字节对齐等因素的影响,这个 copy 操作可能会涉及以下部分或全部步骤:

    1. 分配内存缓冲区用于管理文件 IO 和解压缩操作;

    2. 将文件数据从磁盘读到内存中;

    3. 将压缩的图片数据解码成未压缩的位图形式,这是一个非常耗时的 CPU 操作;

    4. 最后 Core Animation 使用未压缩的位图数据渲染 UIImageView 的图层。

在上面的步骤中,我们提到了图片的解压缩是一个非常耗时的 CPU 操作,并且它默认是在主线程中执行的。那么当需要加载的图片比较多时,就会对我们应用的响应性造成严重的影响,尤其是在快速滑动的列表上,这个问题会表现得更加突出。

为什么要手动图片解码

加载优化:

解压是耗时的,而系统默认是在主线程执行,所以业界通常有一种做法是,异步强制解压,也就是在异步线程主动将二进制图片数据解压成位图数据,使用CGBitmapContextCreate(...)系列方法就能实现。
该处理方式在众多图片处理框架下都有体现。


相关文章

  • SDWebImage 中的图片解码

    为什么图像在显示到屏幕上之前要进行解码 一般我们使用的图像是JPEG/PNG,这些图像数据不是位图,而是是经过编码...

  • 篇1:SDWebImage源码看图片解码

    导语:这是SDWebImage源码理解的第一篇,本篇先介绍图片解码相关的背景知识,然后介绍SDWebImage中解...

  • SDWebImage的图片解码源码阅读

    SDWebImage中对下载完的图片在子线程解码后才放到ImageView中显示,这避免了系统在主线程解码而导致的...

  • SDWebImage有感(二)

    图片解码 为了使图片渲染更加流畅,SDWebImage对下载的图片进行了解码操作。先看下几个常量每个像素占用内存多...

  • SDWebImageDecoder引发的思考

    关于SDWebImage中的SDWebImageDecoder这个类,看完以后有下面几个思考0.为什么图片要解码1...

  • iOS 第三方源码解析

    SDWebImage 首先SDWebImage是我们经常用的一个加载网络图片的库,内部很好的处理了缓存、下载、解码...

  • SDWebImage-Decoder

    图片的解压缩,在SDWebImage中占据了较大的戏份,但其流程还是比较简单的。 图片编解码、解压缩的设计思路: ...

  • SDWebImage-Downloader

    SDWebImage主要的三个功能模块:缓存策略(Cache)、图片的编解码(Decoder)、图片下载(Down...

  • SDWebImage加载不出图片

    SDWebImage加载不出图片,提示信息: 解决思路: 首先分析是不是图片链接存在编解码问题 在分析SDWebI...

  • 关于SDWebImage的实现

    SDWebImage为什么下载图片后先进行解码操作? iOS 提供了两种加载图片方法,分别是UIIImage的im...

网友评论

    本文标题:SDWebImage 中的图片解码

    本文链接:https://www.haomeiwen.com/subject/lvdpcktx.html