iOS 性能优化方案

news/2024/10/18 12:20:49/

一、启动优化

1、冷启动(从零开始的启动)

冷启动三个阶段

1.1 Main函数执行前

  • 加载可执行文件(mach-o文件)
  • 加载动态链接库,进行rebase指针调整和bind符号绑定
  • Objc运行时的初始化处理,包括Objc相关类的注册、category注册、selector唯一性检查
  • 初始化,包括执行了+load()方法、attribute((constructor))修饰的函数调用、创建C++静态全局变量

优化方案

  • 减少动态库加载。每个库本身都有依赖关系,苹果公司建议使用更少的动态库,并且建议在使用动态库的数量较多时,尽量将多个动态库进行合并。数量上,苹果公司建议最多使用 6 个非系统动态库。
  • 减少加载启动后不会去使用的类或者方法
  • +load() 方法里的内容可以放到首屏渲染完成后再执行,或使用 +initialize() 方法替换掉。 因为,在一个+load() 方法里,进行运行时方法替换操作会带来 4 毫秒的消耗。不要小看这 4 毫秒,积少成多,执行 +load() 方法对启动速度的影响会越来越大
  • 控制 C++ 全局变量的数量

1.2 Main函数执行后

主要是指main()函数执行开始,到AppdelegatedidFinishLaunchingWithOptions方法里首屏渲染相关方法的执行

  • 首屏初始化所需要配置文件的读写操作
  • 首屏列表大数据的读取
  • 首屏渲染的大量计算

优化方案

从功能上梳理出哪些是首屏渲染必要的初始化功能,哪些是 App 启动必要的初始化功能,而哪些是只需要在对应功能开始使用时才需要初始化的。梳理完之后,将这些初始化功能分别放到合适的阶段进行

1.3 首屏渲染完成

从渲染完成时开始,到 didFinishLaunchingWithOptions 方法作用域结束时结束

优化方案

  • 功能级优化  
    main() 函数开始执行后到首屏渲染完成前只处理首屏相关的业务,其他非首屏业务的初始化、监听注册、配置文件读取等都放到首屏渲染完成后去做
  • 方法级优化  
    检查首屏渲染完成前主线程上有哪些耗时方法,将没必要的耗时方法滞后或者异步执行。通常情况下,耗时较长的方法主要发生在计算大量数据的情况下,具体的表现就是加载、编辑、存储图片和文件等资源

2、热启动

  • App在内存中,在后台存活着,再次点击图标进入App

3、APP启动的监控手段

  • 定时抓取主线程上的方法调用堆栈,计算一段时间里各个方法的耗时
  • 对 objc_msgSend 方法进行 hook 来掌握所有方法的执行耗时

二、卡顿问题

2.1 CPU和GPU

CUP(Central processing Unit,中央处理器)

对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制(Core Graphics)

CUP优化方案

  • 尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALayer取代UIView
  • 不要频繁的修改UIView的相关属性,比如frame、bounds、transform等
  • 尽量提前计算好布局计算好frame,bounds等,一次性修改不要多次修改
  • 使用Autolayout会比直接设置frame消耗更多的资源
  • 图片的size最好UIImageView的size保持一致,减少CPU资源去进行缩放操作;
  • 控制线程的最大并发数量
  • 尽量耗时操作放到子线程(文本尺寸、图片处理)

GPU(Graphics Processing Unit,图形处理器)

纹理的渲染

GPU优化方案

  • 尽量减少视图数量和层级,多层次的视图绘制更占用GPU资源
  • 尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示
  • GPU能处理的图片的最大尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU资源进行处理,所以纹理尽量不要超过这个尺寸
  • 减少透明的视图(alpha<1),有透明度需要混合计算不透明就设置opaque为YES

2.2 离屏渲染(尽量避免出现离屏渲染)

在OpenGL中,GPU有2种渲染方式

  • On-Screen Rendering:当前屏幕渲染,在当前用于显示的屏幕缓冲区进行渲染操作
  • Off-Screen Rendering:离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作

离屏渲染消耗性能的原因

  • 需要创建新的缓冲区
  • 离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕

优化方案

  • 光栅化,减少使用layer.shouldRasterize = YES
  • 遮罩,减少使用layer.mask
  • 圆角,减少同时设置layer.masksToBounds = YES、layer.cornerRadius大于0(可以考虑通过CoreGraphics绘制裁剪圆角,或者叫UI提供圆角图片)
  • 阴影,减少使用layer.shadowXXX (如果设置了layer.shadowPath就不会产生离屏渲染)

三、耗电优化

  • 尽可能降低CPU、GPU功耗
  • 少用定时器
  • 优化I/O操作
  • 尽量不要频繁写入小数据,最好批量一次性写入
  • 读写大量重要数据时,考虑用dispatch_io,其提供了基于GCD的异步操作文件I/O的API。用dispatch_io系统会优化磁盘访问
  • 数据量比较大的,建议使用数据库(比如SQLite、CoreData)

四、网络优化

  • 减少、压缩网络数据
  • 如果多次请求的结果是相同的,尽量使用缓存
  • 使用断点续传,否则网络不稳定时可能多次传输相同的内容
  • 网络不可用时,不要尝试执行网络请求
  • 让用户可以取消长时间运行或者速度很慢的网络操作,设置合适的超时时间
  • 批量传输,比如,下载视频流时,不要传输很小的数据包,直接下载整个文件或者一大块一大块地下载。如果下载广告,一 次性多下载一些,然后再慢慢展示。如果下载电子邮件,一次下载多封,不要一封一封地下载

五、定位优化

  • 如果只是需要快速确定用户位置,最好用CLLocationManager的requestLocation方法。定位完成后,会自动让定位硬件断电
  • 如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
  • 尽量降低定位精度,比如尽量不要使用精度最高的kCLLocationAccuracyBest
  • 需要后台定位时,尽量设置pausesLocationUpdatesAutomatically为YES,如果用户不太可能移动的时候系统会自动暂停位置更新
  • 尽量不要使用startMonitoringSignificantLocationChanges,优先考虑startMonitoringForRegion:
  • 用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件

http://www.ppmy.cn/news/107239.html

相关文章

c++实现【典型的旅行商问题(TSP)】实现配送中心最多可以用2辆车对8个客户进行运输配送

假定配送中心最多可以用2辆车对8个客户进行运输配送。每个车辆载重均 为8吨,车辆每次配送的最大行驶距离为50km,配送中心(编号0)与8个客 户之间及8个客户相互之间的距离d; (i, j= 1, 2, ... 8)、8个客户的货物需 求r;(j= 1, 2... 8)如表1所示。要求寻找一条路径, 使得配送总…

麓言信息UI设计和web前端的区别

很多想从事互联网岗位的朋友在选择UI设计还是web前端&#xff0c;也不知道选哪个好&#xff0c;今天小编将带你了解UI设计和web前端的区别&#xff0c;让大家对UI设计和web前端有更多的了解&#xff0c;也能为之后的选择有一定的帮助。   UI设计要考虑人机交互的效果   …

设计师们都在用的AI作图神器,你还不抓紧入手一款

人工智能在机器和计算机控制的机器人中模拟人类智能过程。这允许计算机系统执行繁重的任务&#xff0c;帮助人类专注于更重要的事情。因此&#xff0c;多年来&#xff0c;工作场所对 AI 集成的需求不断增加。 同样&#xff0c;人工智能正迅速成为设计行业的一部分。在平面设计…

去了字节跳动,才知道年薪40W的测试有这么多?

今年大环境不好&#xff0c;内卷的厉害&#xff0c;薪资待遇好的工作机会更是难得。最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的…

七大软件架构设计原则详解

目录 1、概述 2、七大设计原则 2.1、开闭原则 2.2、里氏替换原则 2.3、依赖倒置原则 2.4、单一职责原则 2.5、接口隔离原则 2.6、迪米特法则 2.7、合成复用原则 3、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&…

用可编程逻辑器件FPGA LCMXO2-4000HC-6MG132I 实现智能汽车解决方案设计

LCMXO2-4000HC-6MG132I lattice莱迪斯深力科 MachXO2 可编程逻辑器件 (PLD) 由六个超低功耗、即时启动、非易失性 PLD 组成&#xff0c;可提供 256 至 6864 个查找表 (LUT) 的密度。 MachXO2 系列 PLD 提供多种特性&#xff0c;例如嵌入式块 RAM (EBR)、分布式 RAM 和用户闪存 …

git新手将网页设计代码提交到github上

以下是将代码提交到Github上的一些步骤。如果中途遇到问题或不会的需要我帮忙&#xff0c;可以文章底部联系我。 1. 创建Github账户 首先&#xff0c;您需要在Github上注册一个账户。 如果您已经有账户了&#xff0c;请跳过这一步。 2. 创建一个新的repository 在您的Githu…

太优雅了,公司项目终于用上了Spring状态机

1、什么是状态机 1.1 什么是状态 先来解释什么是“状态”&#xff08; State &#xff09;。现实事物是有不同状态的&#xff0c;例如一个自动门&#xff0c;就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机&#xff0c;也就是被描述的事物的状态的数量是有限…