过去的几年里,iOS 应用在视觉方面愈来愈吸引人。图像展现是其中很关键的部分,由于大部分图像展现都须要下载而且渲染。大部分开发者都要使用图像填充表格视图(table views)或者集合视图(collection views)。下载图片消耗一些资源(如蜂窝数据、电池以及 CPU 等)。为了减小资源消耗,一些缓存模型也应运而生。html
为了得到良好的用户体验,当咱们缓存和加载图像时,了解 iOS 底层如何处理是很重要的。此外,大多数使用了图片缓存的开源库也是个不错解决方案。ios
// 假设咱们有一个 NSURL *imageUrl and UIImageView *imageView, 咱们须要经过NSURL下载图片并在UIImageview上展现 if ([self hasImageDataForURL:imageUrl] { NSData *data = [self imageDataForUrl:imageUrl]; UIImage *image = [UIImage imageWithData:imageData]; dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = image; }); } else { [self downloadImageFromURL:imageUrl withCompletion:^(NSData *imageData, …) { [self storeImageData:imageData …]; UIImage *image = [UIImage imageWithData:imageData]; dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = image; }); }]; }
FPS 简介git
layer contents
的图像进行拷贝。 拷贝图像包含如下过程:github
字节位没有正确对齐的图像将被 CoreAnimation 拷贝,以修复字节位对齐并使之能被渲染。这一点在 Apple 文档里没有说明,可是使用 Instruments 代表 CA::Render::copy_image
会执行此操做,即便 Core Aniation 即便没有拷贝图像。web
从 iOS7 开始,第三方应用不能使用JPEG硬件解码器。这意味着咱们只能使用慢不少的软解码器。这一点在 FastImageCache 团队的 GitHub 主页以及 Nick Lockwood 的推文上都有指出。vim
更多的成像相关以及 SDK 框架(CoreGraphics, ImageIO, CoreAnimation, CoreImage)工做原理,CPU vs GPU 等,请阅读 @rsebbe 的文章:Advanced Imaging on iOS缓存
这有一篇文章--CoreData 对比 File System,实现图像缓存的基准测试,结果 File System 的表现更好。app
看一看上面罗列的观点,本身实现图像缓存不只复杂,耗时并且痛苦。这也是为何我倾向于使用开源的图像缓存解决方案,大家大部分已经据说过 SDWebImage 或 new FastImageCache。框架
为了让你知道哪一个开源库最适合你,我作了测试而且分析它们如何知足上述要求。异步
测试库:
注:AFNetworking 加入对比是因为其自iOS7后在磁盘缓存方面出色的表现(基于 NSURLCache 实现)
对于每一个库,我都会使用全新的测试app,而后启动app,等全部图像加载完后,慢慢滑动。而后以不一样力度来回滑动(从慢到快)。接着关掉app强制应用从磁盘缓存中加载图像,最后重复以上测试场景。
相关 demo 能够在 GitHub 找到并获取,名字是 ImageCachingBenchmark,同时还有本次实验的图表、结果数据表以及更多。
请注意,请注意 GitHub 上的工程和图像缓存库都须要作一些调整,以便能让咱们看到每一张缓存的图片都可以被加载出来。因为我不想检查 Cocoapods 源码文件(不是个好习惯),因此须要对 Cocoapods clean 后从新编译工程代码,目前 GitHub 上的版本与我作测试的版本有些差异。
若是大家想从新跑一下测试,你须要编写相同 completionBlock 用于图像加载,全部库得要跟默认的 SDWebImage 同样返回 SDImageCacheType。
在 GitHub 工程上能看到完整的基准测试结果,因为这些表格很大,我只使用运行最快的设备 iPhone 5s 和运行最慢的 iPhone 4 来测试。
汇总:
表格名词解释:
从头开始编写 iOS 图像缓存组件很困难
SDWebImage 和 AFNetworking 是稳定的工程。因为有不少贡献者,这样保证代码可以及时获得维护,FastImageCache 在维护方面更新很快。
基于以上全部数据,我认为 SDWebImage 在目前是一个很好的解决方案。即便有些工程使用 AFNetworking 或 FastImageCache 更好,可是这些都依赖于项目需求。
原文:iOS image caching. Libraries benchmark (SDWebImage vs FastImageCache)
译者:夜微眠
校对:蓝魂、Cocoa
首发 CocoaChina