iOS图片加载渲染的优化

在iOS中高效的加载图片 在iOS开发中,图片(UIImage)是我们在开发中,占用手机内存比较大的对象,如果在运行过程中,内存占用过大,对电池寿命会造成影响,如果超过了内存占用的最大值,会造成App的crash。这篇文章从图片的加载原理和SDWebImage的源码实现的角度来介绍图片加载。 图片的渲染流程 在iOS中使用 UIImage和UIImageView来记载图片,他俩遵守经典的MVC架构,UIImage相当于Model,UIImageView相当于View: UIImage负责加载图片,UIImageView负责渲染图片 阅读详情

首先我们来看iOS加载一张图片所经历的过程:(下面所讲述的代码基本以      imageWithContentsOfFile 方法来举例)

数据加载

  1. 我们优先创建UIImageView,把获得的图像数据赋值UIImageView
  2. 识别到我们缓冲区没有数据,就会去从磁盘拷贝数据到缓冲区
  3. 然后加载我们的图片
  4. 拿到了图片,下面到了视图渲染

视图渲染

  1. 图片数据在CoreAnimation流水线中,执行如下流程
  2. 优先计算视图Frame,进行视图构建和图片格式转换
  3. 如果图像未解码,则优先解码成位图数据
  4. 进行打包处理,主线程Runloop将其提交给Render Server
  5. 在提交之前,如果数据没有字节对齐,CoreAnimation会再拷贝一份数据,进行字节对齐
  6. 然后经过GPU图形渲染管线处理以后将渲染结果放入帧缓冲区
  7. 然后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,给显示器显示

从上述渲染过程中,我寻找其可优化点。

  1. 图像解码
  2. 内存加载
  3. 对齐字节

1.图像解码

        当你用 UIImage 或 CGImageSource 的那几个方法创建图片时,图片数据并不会立刻解码。图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 GPU 前,CGImage 中的数据才会得到解码。这一步是发生在主线程的,并且不可避免。那么当需要加载的图片比较多时,就会对我们应用的响应性造成严重的影响,尤其是在快速滑动的列表上,这个问题会表现得更加突出。

        iOS默认会在主线程对图像进行解码。解码过程是一个相当复杂的任务,需要消耗非常长的时间。由于在主线程超过16.7ms的任务会引起掉帧,所以我们把解码操作从主线程移到子线程,让耗时的解码操作不占用主线程的时间,解码的核心方法如下:

CGContextRef CGBitmapContextCreate(
void * data, //这块内存用于存储被绘制的图形,这块内存的size最小不能小于bytesPerRow*height(图形每行的字节数乘以图形的高度),传递NULL意味着由这个函数来管理图形的内存,这可以减少内存泄漏的问题;
size_t width, //图形的width
size_t height,//图形的height
size_t bitsPerComponent, //像素的每个颜色分量使用的 bit 数,在 RGB 颜色空间下指定 8 即可
size_t bytesPerRow,//位图的每一行使用的字节数,大小至少为 width * bytes per pixel 字节。有意思的是,当我们指定 0 时,系统不仅会为我们自动计算,而且还会进行 cache line alignment 的优化
CGColorSpaceRef  _Nullable space, //就是我们前面提到的颜色空间,一般使用 RGB 即可;
uint32_t bitmapInfo//是一个枚举,
)

异步解码上代码

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
      NSString *imagePath = self.imagePaths;
      UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
      UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, YES, 0);
      [image drawInRect:imageView.bounds];
      image = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();
      dispatch_async(dispatch_get_main_queue(), ^{
      });
  });

虽说能够正常解压,但是我们也会发现一个问题,就是大图片的解压,所以这个地方安装苹果和各大三方代码中的提示要分为2种情况讨论:

1.对于小于60M的图片我们直接对图片解码,下面是SD的代码


+ (UIImage *)decodedImageWithImage:(UIImage *)image {
    if (![self shouldDecodeImage:image]) {
        return image;
    }
    
    CGImageRef imageRef = [self CGImageCreateDecoded:image.CGImage];
    if (!imageRef) {
        return image;
    }
    UIImage *decodedImage = [[UIImage alloc] initWithC
Flutter实战:利用外接纹理实现高性能图片加载与渲染 本文详细介绍了在Flutter应用中使用外接纹理(Texture)技术实现高性能图片加载与渲染的实战方法。通过对比传统图片加载流程,外接纹理技术避免了数据多次拷贝,显著提升加载速度3-5倍并减少内存占用40%。文章包含完整的Flutter、iOS和Android实现代码,以及性能优化技巧和常见问题解决方案,帮助开发者解决图片密集型应用的性能瓶颈问题。 阅读详情

相关推荐

Flutter实战:利用外接纹理高效加载与渲染网络图片

本文深入探讨了在Flutter应用中使用外接纹理技术高效加载与渲染网络图片的实战方案。通过对比原生Image.network的瓶颈,详细阐述了外接纹理的原理,并提供了从Dart端Texture Widget封装到iOS端集成SDWebImage、实现PixelBuffer转换的完整代码实现与性能优化指南,旨在解决图片密集型应用中的卡顿与内存问题。

weixin_29001655的博客 584

H5海报生成技术:Canvas实现与跨平台优化

H5海报生成技术是现代Web开发中常见的需求,尤其在营销活动和社交传播场景中广泛应用。其核心原理是通过Canvas或SVG在前端实现动态渲染,或借助Node.js等服务端技术生成图片。这种技术不仅能实现实时数据绑定和跨平台适配,还能提升用户体验和传播效果。在实际工程实践中,前端方案如html2canvas库因其轻量化和易用性,成为90%简单海报需求的首选。对于复杂场景,服务端渲染则能有效规避客户端性能问题。典型的应用包括电商商品分享、社交邀请函和数据可视化报告。通过合理处理跨平台兼容性和性能优化,如iOS的

weixin_33768481的博客 424

UniApp图片优化指南:从模糊到高清的完整调试过程

本文提供了UniApp项目中图片模糊问题的完整诊断与优化指南。通过分析资源质量、多端DPI适配、CSS渲染属性(如image-rendering)及服务端配合等核心环节,系统性地解决图片显示不清晰问题,提升应用视觉体验与性能。

kappa的博客 687

图片内容性能四维优化:尺寸、格式、加载与渲染

图片作为网页中唯一兼具语义、视觉与性能负担的复合型资源,其加载表现直接决定LCP、CLS等核心用户体验指标。理解图片的本质——不是静态文件,而是需被策略性治理的内容载体——是性能优化的起点。从原始尺寸裁剪到现代格式选型(WebP/AVIF/SVG),从原生懒加载到Intersection Observer精准控制,再到aspect-ratio与骨架屏保障布局稳定性,每一步都需兼顾兼容性、可维护性与用户网络环境。尤其在响应式场景下,‘一张图拖垮页面’的本质,是内容策略、编码决策与渲染机制的系统性失配。本文聚焦

weixin_30972263的博客 244

iOS性能优化实战:从内存管理到渲染掉帧的排查指南

在移动应用开发中,性能优化是一项系统工程,涉及CPU、内存、渲染、网络等多个维度。理解iOS的内存管理机制、RunLoop与图层渲染原理,是定位卡顿和OOM的基础。通过Instruments、MetricKit等工具建立性能基线,能高效排查循环引用、离屏渲染、主线程阻塞等高频问题。其技术价值在于,从底层原理到工程实践的系统化优化,可显著提升App启动速度、列表流畅度与网络稳定性。应用场景覆盖原生App、H5页面及微信小程序,如iOS上textarea失焦遮挡、公众号页面重复刷新、小屏设备请求失败等,都能从资

weixin_29001655的博客 254

微信H5海报保存的‘坑’我都替你踩完了:html2canvas配置避坑与iOS/安卓兼容指南

本文详细解析了微信H5海报保存的常见问题与解决方案,重点介绍了html2canvas的核心配置技巧,包括处理图片模糊、跨域图片加载和滚动区域截取等关键问题。同时提供了针对iOS和安卓平台的兼容性优化建议,帮助开发者实现完美的H5海报保存功能。

weixin_29011993的博客 421

Uniapp结合wxml-to-canvas实现动态页面截图与分享功能

本文详细介绍了如何在Uniapp中结合wxml-to-canvas实现动态页面截图与分享功能。通过分步教程和实战代码示例,帮助开发者掌握从页面内容转换到Canvas画布,再到生成可分享图片的全流程。特别针对电商、社交等场景,提供了性能优化和跨平台兼容性解决方案,有效提升用户体验和分享转化率。

weixin_30369041的博客 429

别让Liquid Glass拖慢你的App!给uni-app开发者的iOS 26动画优化清单(含代码示例)

本文为uni-app开发者提供了针对iOS 26动画性能问题的优化方案,特别是应对Liquid Glass设计导致的滑动卡顿问题。通过CSS优化、页面切换调整、列表滚动技巧和资源加载策略,帮助开发者提升应用在旧款iPhone上的流畅度,包含实用代码示例和实测数据。

weixin_42641998的博客 299

Flutter 3.44版本解析:性能优化与跨平台开发新特性

跨平台开发框架Flutter通过其高效的渲染引擎和丰富的组件库,为开发者提供了构建高性能应用的解决方案。Flutter 3.44版本在性能优化、开发体验和多平台兼容性方面进行了显著改进,包括Android编译管道优化、iOS SwiftPM支持完善以及Web渲染性能提升。这些改进不仅缩短了增量编译时间,还增强了Material组件的灵活性和交互体验。在工程实践中,Flutter 3.44的预测性返回导航和Hybrid Composition性能提升等特性,为开发者提供了更流畅的开发体验和更优质的用户界面。

weixin_34375251的博客 352

Flutter自研高性能图片裁剪组件开发实践

图片处理是移动开发中的常见需求,其核心原理涉及图像解码、矩阵变换和手势交互。通过FFI调用原生平台图像处理库(如iOS的Core Image和Android的Bitmap API)可突破Flutter的性能瓶颈,结合CustomPainter实现跨平台UI渲染。在电商、社交等场景中,高性能裁剪组件能显著提升用户体验。本文分享的Flutter裁剪方案采用混合架构设计,通过MethodChannel桥接原生能力,支持多点触控、动态比例调整等专业功能,并针对大图处理优化了内存管理和渲染性能,解决了社区插件常见的卡

weixin_29682503的博客 233

微信小程序页面滑动问题终极解决方案:从iOS空白页到安卓兼容性全搞定

本文深入解析微信小程序页面滑动问题,特别是iOS空白页和安卓兼容性问题,提供从基础到高级的完整解决方案。通过CSS重置、弹性布局和性能优化技巧,帮助开发者解决滑动卡顿、滚动穿透等常见问题,提升用户体验和页面性能。

weixin_30919429的博客 71

网易iOS校招提前批笔试全攻略:从OC内存到编程题策略

在iOS开发校招准备中,理解底层原理比死记API更重要。Objective-C Runtime作为动态机制的核心,决定了方法查找、消息转发等关键行为,是面试官辨别候选人技术深度的分水岭。围绕Runtime,引用计数与weak指针的底层维护逻辑、Block对变量的捕获方式,共同构成了内存管理的必备认知。另一大高频考点是GCD多线程,串行/并发队列与同步/异步任务的组合、死锁产生条件,直接反映工程并发设计能力。这些概念的价值不仅在于应对笔试,更在于后续解决真实项目中的性能优化、崩溃防护等问题。在网易等大厂校招提

weixin_33994429的博客 394

25、iOS开发:餐厅列表与详情页面的数据展示实现

本文详细介绍了在iOS开发中实现餐厅列表和详情页面的数据展示功能。内容涵盖从数据管理器的创建、集合视图的数据填充到餐厅详情页面地图快照的生成。同时,还分析了开发中常见的问题,例如列表滚动卡顿和地图快照性能问题,并提供了优化思路,如使用异步加载和缓存机制。通过这些步骤和优化,开发者可以快速构建高效、流畅的餐厅展示功能。

ujm567890的博客 89

用宝塔面板+CentOS 7.6,30分钟搞定DNF手游私服搭建(附全套资源下载)

本文详细介绍了如何使用宝塔面板和CentOS 7.6在30分钟内快速搭建DNF手游私服。通过图形化界面操作,无需复杂命令,即可完成服务端部署、MySQL数据库配置及客户端适配,适合Linux新手快速上手。

weixin_33737774的博客 608

Cadence Virtuoso ADE L保姆级教程:从DC到Noise,一次搞定6种仿真设置

本文提供Cadence Virtuoso ADE L的全面仿真教程,涵盖DC工作点分析、瞬态响应、AC特性、零极点分布和噪声性能等6种仿真设置。通过详细的步骤和实用技巧,帮助工程师高效完成从基础配置到高级后处理的完整工作流,显著提升IC设计效率。

weixin_26841743的博客 601

EPICS pythonSoftIOC教程

EPICS pythonSoftIOC教程

yuyuyuliang00的博客 1522

三相Vienna整流器过零点电流畸变?试试这个SVPWM调制波补偿技巧

本文针对三相Vienna整流器在电流过零点附近出现的电流畸变问题,提出了一种基于SVPWM调制波补偿的有效解决方案。该方法通过注入零序分量重构占空比,巧妙解决因拓扑约束导致的调制矛盾,在基本不增加计算复杂度的前提下,显著平滑电流波形,降低THD。

weixin_29212867的博客 115

基于STM32-XPC仿真平台的构架

基于STM32-XPC仿真平台的构架 xPC Target是MathWorks公司的MATLAB提供的一个基于RTW(Real-Time Workshop)体系框架的附加产品,是一种用于产品原型开发、测试和配置实时系统的PC机解决途径。xPC目标实时仿真系统能够使开发者在产品开发前进行产品原型的快速实现、测试和评估,是 Simulink 工具集下用于产品原型开发设计测试集于一体的工具箱。

sujianbonwpu的博客 4489

【CVPR2025 DEIM】超详细!手把手训练自己的数据集教学:从源码下载,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。本文在win系统上训练,最强实时目标检测算法!

本文详细介绍了CVPR2025 DEIM目标检测模型的完整使用流程。内容包含:1)源码下载与虚拟环境配置;2)Visdrone2019数据集准备与配置文件修改;3)训练参数设置及Windows系统常见问题解决方案;4)模型验证、推理测试及热力图生成方法。特别针对Windows用户提供了虚拟环境配置指导,并详细说明了数据集路径设置、参数调整等关键步骤。通过本文的指导,小伙伴可以快速掌握DEIM模型的使用方法,用于学术论文研究和实验分析。

Ai缝合怪、助力小伙伴高效发论文 7659

【unity游戏开发之InputSystem——01】通过写代码监听InputSystem输入(基于unity6开发介绍)

通过写代码监听InputSystem输入(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4892

硬件工程师笔记——电子器件汇总大全

本文系统总结了14种常用电子器件的工作原理及功能应用,包括电阻、压敏电阻、电容、电感、二极管、三极管、MOS管、晶振、光耦、IGBT、继电器、磁珠、可控硅和线性稳压器。每种器件从结构原理、工作特性到典型应用进行全面解析,如电阻的限流分压、电容的储能滤波、三极管的放大开关等。重点阐述了各器件在电路设计中的关键作用,如IGBT的功率控制、继电器的隔离保护、LDO的电压稳定等,并提供了实际电路应用案例。文章还整理了硬件工程师笔试面试相关的知识点和真题资源,为电子工程师提供全面的技术参考。

XU157303764的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 搭建一个RN组件库
下一篇: iOS CPU渲染能做的事情
develop_csdn_LGQ
博客等级 码龄10年 21粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值