iOS图片缓存库基准对比

iOS图片下载缓存与读取技术实现 NSCache提供了多种策略,比如限制缓存对象的数量或总容量,可以按照这些策略来优化内存使用。下面是一个示例,展示如何设置NSCache的容量限制:imageCache.countLimit = 20 // 限制缓存对象的数量imageCache.totalCostLimit = 100 * 1024 * 1024 // 限制缓存总成本,这里是100MB在这个例子中,我们限制了NSCache最多只能存储20个对象,并且总共占用的内存不会超过100MB。NSCache。 阅读详情

原文:iOS image caching. Libraries benchmark (SDWebImage vs FastImageCache),译者夜微眠(github地址),校对蓝魂(博客)、Cocoa(博客)。
1.引言

过去的几年里,iOS应用在视觉方面越来越吸引人。图像展示是其中很关键的部分,因为大部分图像展示都需要下载并且渲染。大部分开发者都要使用图像填充表格视图(table views) 或者 集合视图(collection views) 。下载图片消耗一些资源(如蜂窝数据、电池以及CPU 等)。为了减少资源消耗,一些缓存模型也应运而生。

为了获得良好的用户体验,当我们缓存和加载图像时,了解iOS底层如何处理是很重要的。此外,大多数使用了图片缓存的开源库也是个不错解决方案。

2.常用的解决途径

  • 异步下载图像

  • 处理图像(拉伸,去红眼,去边框)以便展示

  • 写入磁盘

  • 需要时从磁盘读取并展示 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 假设我们有一个 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 简介

  • UI渲染理想情况FPS=60

  •  60FPS => 16.7ms 每帧 这就意味着 如果任何主线程操作大于16.7ms,动态FPS将会下降,因为cpu忙于处理其他事情 而不是渲染UI。

3.常用解决途径的缺点

  • 从磁盘加载图像或文件时间消耗昂贵(磁盘读取比内存读取慢大概10 - 1000倍,如果是SSD硬盘 可能与内存读取速度更接近(大概慢10倍)。参考这里的比较:Introduction to RAM Disks。如果使用SSD,将获得接近内存的速度(大概比内存访问速度慢十倍),但目前还没有手机和平板集成SSD模块。

  • 创建UIImage实例将会在内存区生成一个图片的压缩版。但是压缩后的图像太小且无法渲染,如果我们从磁盘加载图像,图像甚至都没有加载到内存。解压图片同样也很消耗资源。

  • 设置imageView的image属性,这种情况下将会创建一个CATransaction并加入主循环中。在下一次循环迭代中,CATransaction会对任何设置为layer contents的图像进行拷贝。

拷贝图像包含以下过程:

  • 给文件io 和 解压缩 分配缓冲区

  • 读取磁盘数据到内存

  • 解压图像数据(生成原位图) - 高cpu消耗

  • CoreAnimation 使用解压数据并渲染

字节位没有正确对齐的图像将被CoreAnimation拷贝,以修复字节位对齐并使之能被渲染。这一点在Apple 文档里没有说明,但是使用Instruments表明 CA::Render::copy_image会执行此操作,即使Core Aniation 即使没有拷贝图像。

从iOS7 开始,第三方应用不能使用JPEG硬件解码器。这意味着我们只能使用慢很多的软解码器。这一点在FastImageCache团队的 GitHub主页以及 Nick Lockwood的推文上都有指出。

4.一个强大的iOS图像缓存需包含以下部分: 

  • 异步下载图像,尽可能减少使用主线程队列。

  • 使用后台队列解压图像。这是个复杂的过程,请阅读Avoiding Image Decompression Sickness(http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/)。

  • 在内存和磁盘上缓存图像。在磁盘上缓存图像很重要,因为app可能因为内存不足而被强行关闭或者需要清理内存。这种情况下,重新从磁盘加载图像比下载会快很多。备注:如果使用NSCache作为内存缓存,当有内存警告时,NSCache会清空缓存内容。NSCache相关细节请查看nshipster 上这篇文章:NSCache

  • 保存解压过的图片到硬盘以及内存中,以避免再次解压。

  • 使用GCD 和 blocks,这将使得代码更加高效和简单。如今GCD 和 blocks是异步操作时必需的。

  • 最好使用UIImageView的分类以便集成

  • 最好在下载后以及存入到缓存前能够处理图像

iOS图像优化 

更多的成像相关以及SDK框架(CoreGraphics,ImageIO,CoreAnimation,CoreImage)工作原理,CPU vs GPU 等,请阅读@rsebbe的文章:Advanced Imaging on iOS

Core Data 是一个好的选择吗?

这有一篇文章--CoreData 对比File System,实现图像缓存的基准测试。结果File System的表现更好(正如我们所预期的)

看一看上面罗列的观点,自己实现图像缓存不仅复杂,耗时而且痛苦。这也是为什么我倾向于使用开源的图像缓存解决方案。你们大部分已经听说过SDWebImage或new FastImageCache。

为了让你知道哪个开源库最适合你,我做了测试并且分析它们如何满足上述要求。

5.基准测试

测试库:

注:AFNetworking 加入对比是由于其自iOS7后在磁盘缓存方面出色的表现(基于NSURLCache实现)

测试场景

对于每个库,我都会使用全新的测试app,然后启动app,等所有图像加载完后,慢慢滑动。然后以不同力度来回滑动(从慢到快)。接着关掉app强制应用从磁盘缓存中加载图像,最后重复以上测试场景。

关于测试app工程

-相关demo可以在Github找到并获取,名字是ImageCachingBenchmark。同时还有本次实验的图表、结果数据表以及更多。

-请注意,请注意Github上的工程和图像缓存库都需要做一些调整,以便能让我们看到每一张缓存的图片都能够被加载出来。由于我不想检查Cocoapods源码文件(不是个好习惯),所以需要对Cocoapods clean后重新编译工程代码 。目前Github上的版本与我做测试的版本有些差别。

-如果你们想重新跑一下测试,你需要编写相同completionBlock用于图像加载,所有库得要跟默认的SDWebImage一样返回SDImageCacheType。

最快与最慢的设备对比结果

在Github工程上能看到完整的基准测试结果,由于这些表格很大,我只使用运行最快的设备iPhone 5s和运行最慢的iPhone 4来测试。

001.jpg


002.jpg


003.jpg


004.jpg

汇总:

74.jpg

表格名词解释

- 异步下载 = 库支持异步下载

-后台解压 =通过后台队列或线程执行图像解压

-存储解压 = 存储解压后的图像版本

-内存/磁盘缓存 = 支持内存/磁盘缓存

-UIImageView分类 = 库中含UIImageView 类别

-从内存/磁盘 = 从缓存(内存/磁盘)中读取的平均时间

6.结论

-从头开始编写iOS图像缓存组件很困难

-SDWebImage 和 AFNetworking 是稳定的工程。由于有很多贡献者,这样保证代码能够及时得到维护。FastImageCache在维护方面更新很快。

-基于以上所有数据,我认为SDWebImage 在目前是一个很好的解决方案。即使有些工程使用AFNetworking 或 FastImageCache更好。但是这些都依赖于项目需求。

iOS图片加载神器SDWebImage库实战教程 本文还有配套的精品资源,点击获取 简介:SDWebImage是一个iOS开发中广泛使用的开源库,专门用于加载和缓存网络图像。它提供了异步加载、内存和磁盘缓存、URLSession集成、图片解码、占位图和加载进度、GIF和WebP支持、国际化和兼容性、可扩展性、安全性和错误处理等高级特性。本教程将通过实战项目,带领你掌握SDWebImage库的实际应用,包括图片加载、缓存、解... 阅读详情

相关推荐

ios-MUImageCache - 简单轻量的图片缓存框架.zip

GitHub:https://github.com/Jeykit/MUKit 简书:https://www.jianshu.com/p/69dc2f154ffe 优点: 1.可将多张小图解码后存储到同一张大图上,在同屏渲染多图时,效率极高; 2.支持mmap内存映射,高效的I/O操作,减少一次文件拷贝操作 3.减少内存占用; 支持Byte Alignment字节对其,渲染过程中,避免执行CA::Render::copy_image内存操作; 4.支持图片绘制圆角,并避免调用( layer.cornerRadius; layer.masksToBounds)

iOS图片加载速度极限优化—FastImageCache解析

FastImageCache是Path团队开发的一个开源库,用于提升图片的加载和渲染速度,让基于图片的列表滑动起来更顺畅,来看看它是怎么做的。 优化点 iOS从磁盘加载一张图片,使用UIImageVIew显示在屏幕上,需要经过以下步骤: 从磁盘拷贝数据到内核缓冲区 从内核缓冲区复制数据到用户空间 生成UIImageView,把图像数据赋值给UIImageView 如果图

u013326525的专栏 608

iOS把图片缓存到本地的几种方法(总结)

下面小编就为大家分享一篇iOS把图片缓存到本地的几种方法总结,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

ios开发中关于图片缓存的问题整理

先说说缓存机制:   无缓存情况下:   对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的。      上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存。   为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘

fengpei_fly的博客 5693

Rust Reqwest+Rustls 自签名证书校验

所以这里必须保证reqwest引用的rustls库和本地工程一致。以上就是实现不校验签名的逻辑,后续自己可以在对应回调进行逻辑判断。

bawomingtian123的专栏 1349

从零到一:FAST_LIO与FAST_LIO2算法环境搭建与实战评测

本文详细介绍了FAST_LIO与FAST_LIO2算法的环境搭建与实战评测,包括算法原理、环境配置避坑指南、源码编译技巧及性能对比。FAST_LIO2凭借ikd-tree数据结构在动态环境中表现优异,处理速度提升至15ms,内存占用降低40%。文章还提供了常见问题排查和进阶优化技巧,助力开发者高效实现SLAM应用。

weixin_29271053的博客 470

用python对比两种图片的相似程度

结构相似性指数(Structural Similarity Index, SSIM):比较两张图片的结构、亮度和对比度等方面的相似程度,结果介于-1到1之间,越接近1表示两张图片越相似。注意,如果两张图片的像素大小不一致,需要进行预处理以保证计算结果的准确性。另外,这种方法可能无法捕捉到图片的语义相似度,例如两张内容相似但颜色有所不同的图片。均方误差(Mean Square Error, MSE):计算两张图片的每个像素值之间的平均差值,结果越小表示两张图片越相似。

k1419197516的博客 3047

Maxwell涡流热损计算:铜导体在50Hz交流下的仿真实践

本文详细介绍了使用Maxwell软件进行铜导体在50Hz交流条件下的涡流热损仿真实践。从涡流热损的基本概念到Maxwell仿真设置、网格划分、结果后处理等关键步骤,提供了实用技巧和常见问题解决方案,帮助工程师准确计算涡流热损,优化电力设备设计。

weixin_42526015的博客 390

iOS UIImage图片缩放性能对比

前言 最近做挺多的图片处理,透视、缩放、拼接、裁剪、效果等等,那么今天就先来详细对比一下系统API处理缩放的性能,这样也好方便选择那种更优的方式来处理 GitHub地址:KJExtensionHandler | | 这里有一个iOS交流圈:891 488 181 不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长! 大致分为以下五种API: UIKit,画布 drawInRect: 和 UIGraphicsGetImageFromC

henry_lei的博客 640

告别手动连接!一键搞定Mumu模拟器与Android Studio的ADB配置

本文详细介绍了如何通过编写自动化脚本,一键完成Mumu模拟器与Android Studio的ADB连接配置。告别繁琐的手动命令输入,该脚本能智能检查环境、判断连接状态并自动处理端口转发,显著提升Android开发者的调试与测试效率。

yog99的博客 495

QuickFix Java 讲解(一)概述、下载方法,和协议内容

本系列力求手把手教你怎样利用QuickFix Java 搭建自己的 FIX 协议收法平台,以及其中的注意事项。 所有源码的地址(免费): https://github.com/zongzhec/QuickFixPractise 1. 什么是FIX,QuickFix,Quick Java? 1.1. 什么是FIX 官网以及其他翻译自官网的帖子都太官方了,这里我们设想一个情景: 你是一个交易员,现在客户打电话来让你下个单买点股票。你啪啪啪的在你的机器上熟练地输入了下单指令。系统显示:成...

4573

iOS 图片缓存库基准对比

原文: iOS image caching. Libraries benchmark (SDWebImage vs FastImageCache)1.引言过去的几年里,iOS应用在视觉方面越来越吸引人。图像展示是其中很关键的部分,因为大部分图像展示都需要下载并且渲染。大部分开发者都要使用图像填充表格视图(table views) 或者 集合视图(collection views) 。下载图片消耗一

jichw的专栏 582

别再乱按F8了!Win10系统修复的正确姿势:用管理员CMD运行sfc /scannow

本文详细介绍了Windows 10系统修复的正确方法,重点推荐使用管理员CMD运行`sfc /scannow`命令。相比传统的F8键和重装系统,这一方法更高效且安全,能解决大多数系统文件损坏问题。文章还提供了管理员CMD的启动方式、sfc命令的完整参数解析以及实战故障排除流程图,帮助用户快速恢复系统健康。

weixin_29218963的博客 459

iOS图片缓存基准测试项目指南:ImageCachingBenchmark

iOS图片缓存基准测试项目指南:ImageCachingBenchmark 1. 目录结构及介绍 本项目ImageCachingBenchmark位于GitHub,专注于评估iOS平台上的图片缓存解决方案性能。以下是其大致的目录结构与关键组件介绍: 根目录: LICENSE: 许可证文件,声明项目遵循MIT协议。 README.md: 项目说明文档,涵盖了简介、目标、以及如何运行基准测试的信...

gitblog_00349的博客 930

RedVQA:轻量级无参考视频质量评估算法原理与工程实践

视频质量评估是计算机视觉领域的关键技术,旨在通过算法自动量化视频的观看体验。其核心原理在于模拟人眼视觉系统,从像素数据中提取并融合空域和时域特征,以预测主观质量分数。这项技术的价值在于,它能自动化处理海量视频内容的质量监控,为流媒体服务、移动设备影像优化等场景提供关键指标。无参考视频质量评估作为该领域的前沿方向,无需原始无损视频作为参考,更贴合实际应用。本文以RedVQA项目为例,深入剖析了如何利用轻量化的深度网络架构,如MobileNetV3,结合高效的时空特征融合模块,在保证评估精度的同时,大幅降低计算

weixin_28698129的博客 575

C# USB通信实现

在C#中,我们可以利用.NET框架提供的类库和API来实现与USB设备的通信。本文将介绍如何使用C#进行USB通信,并提供相应的代码示例。以上就是使用C#进行USB通信的基本过程。通过以上代码示例,你可以实现与USB设备的简单通信,具体的实现方式和细节根据你的实际需求进行调整和扩展。命名空间,该命名空间包含了与串口通信相关的类和方法。选择需要通信的USB设备,然后使用。步骤二:获取可用的USB设备列表。首先,在你的C#项目中引入。步骤三:打开USB端口。步骤六:关闭USB端口。步骤一:引入命名空间。

PixelProX的博客 4382

sdwebimage缓存图片对比问题

开发IOS项目的时候,发现一个关于第三方框架sdwebimage的图片缓存的问题。搜了一下百度,发现有人已经提出同样的问题,如下: 有个问题请教一下各位,就是用sdwebimage下载图片的时候会缓存到手机上,那么我把同一个url下面的图片换了,这个时候再用sdwebimage加载这个url,他是用缓存的还是重新下载了? 如果,她加载了缓存的图片那么就错了,因为这个url下的图片已经换

Benson的学习笔记 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

iOS图片的下载缓存全部在此

注意: 我的文章只写给自己看 ---------------------------------------------------------------------------------------- (一)这部分(感觉out了), 但是还是保留,  算是学习的痕迹. ---------------------------------------------------------

deep_explore的专栏 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

iOS 缓存机制 (以SDWebImage 缓存图片为例)

在iOS开发过程中,经常要用到缓存机制,那么如何较为好的设计一个缓存机制呢?在这里,小编以SDWebImage为例,说一下这个缓存机制: UIImageView+WebCache: setImageWithURL:placeholderImage:options: 先显示 placeholderImage ,同时由SDWebImageManager 根据 URL 来在本地查找图片。 SDWebIm

lf644206005的专栏 1340

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: UIScrollView
下一篇: Apple 联系大全
「已注销」
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值