前言

在项目中,直接面向用户的客户端往往是一个项目的门面。因而,在项目开发建设的过程中,为了交给用户体验较佳的客户端App,保证产品交给质量。往往需求咱们开发者重视客户端软件的功能指标问题。因而,咱们要对运用的功能优化专题有所研究!!
咱们一般重视的功能指标有:

  • 页面卡顿
  • 耗电、发热
  • 网络优化
  • 运用启动
  • 安装包瘦身

咱们在开发建设项目过程中,能够粗略划分为几个阶段:开发阶段测验阶段保护阶段:

  • 开发阶段,咱们要把握功能调试功能监测的手段,然后保证,在当前安稳版本的客户端软件,有一个比较合理的功能保证;
  • 测验阶段,测验团队等若干搭档往往会给咱们提出一些用户体验上的反应和主张,因而,咱们需求把握功能调试的手段,然后改造出比较契合团队要求的产品;
  • 在上线保护阶段,针对现已上线的运用,咱们的开发团队要有线上功能监控的能力,然后及时收集不满足功能指标要求的业务交互场景和过程,捕获具体问题进行分析,然后以此为依据作为有用迭代优化咱们客户端的有力助力。

为此,咱们本次将会用几篇文章,环绕一些常见的功能指标,去重视 怎么调试、怎么监测、怎么改善处理问题:

  • Instruments
    • 01-iOS功能优化|功能调试东西Instruments简略介绍
    • 02-iOS功能优化|功能调试东西Instruments-CoreAnimation运用
    • 03-iOS功能优化|功能调试东西Instruments-Leaks东西运用
    • 04-iOS功能优化|功能调试东西Instruments-Allocations东西运用
  • 其它功能指标的重视
    • 05-iOS功能优化|常见的几个功能指标要害:页面卡顿、离屏烘托、耗电优化、App启动优化、安装包瘦身
    • 06-iOS功能优化|功能指标监测

一、概述

本文首要是针对 开发阶段测验阶段 这两个线下场景,环绕常见的几个功能指标要害:页面卡顿离屏烘托耗电优化App启动优化,展开来陈说怎么利用Instruments东西进行功能调试的。关于相关的同一主题的其它要害,咱们会在其它文章,用新的篇幅进行评论。

二、 Instruments东西

咱们前面经过一篇文章简答介绍了Instruments这个苹果官方自带的调试东西,若本篇文章是您阅览我的第一篇文章,且您对Instruments了解甚少,能够先阅览我的这篇文章先对该东西有根本的认识:Instrument简略介绍

咱们一般能够右击Xcode翻开Instruments东西: Xcode->Open Developer Tool->Instruments

02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用
咱们还能够在Xcode翻开项目的前提下,经过以下两个办法翻开Instruments:

  1. 按下两个键:Command + I翻开Instrument;
  2. 或者点击:Xcode->product->profile;
    02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用

三、Core Animation东西

1、界面

02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用

2、简介

留意这个调试有必要运用真机,点击左上角的赤色圆圈就会开端录制

02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用

3、在Xcode13中经过Blank自己装备一个CoreAnimation

在我翻开Xcode13的Instruments的时分,我惊呼 CoreAnimation进口怎么弄不见了??? 多了SwiftUI等进口….转念一想,必定是苹果近几年推进开发者运用Swift开发,最近又强推SwiftUI,因而把以前的界面调试进口给干掉了。不过经过查询官方文档,咱们得知新版的Xcode还支撑自己装备调试指标。这简直太爽了!!! 现在简略介绍一下怎么自己装备出一个CoreAnimation:

3.1.翻开一个Blank

02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用

3.2.装备CoreAnimation

  • 咱们先找一个旧的Xcode,看看 CoreAnimation长什么样子:
    02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用
  • 翻开 blank之后的页面:
    02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用
  • 添加装备项:
    • Core Animation FPS
    • Time Profile
    • Thermal State
      02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用
    • 装备回来了!!!
      02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用

咱们需求了解两个两个区域:

  1. 这儿记录#了实时的fps数值,有些当地是0是由于屏幕没有滑动;
    • fps(frames per second),帧率。
    • 任何屏幕总是有一个改写率,比方iphone引荐的改写率是60Hz,也就是说GPU每秒钟改写屏幕60次,因而两次改写之间的距离为16.67ms。
    • 这段时刻内屏幕内容保持不变,称为一帧(frame),fps表明frames per second,也就是每秒钟显现多少帧画面
    • 关于停止不变的内容,咱们不需求考虑它的改写率,但在执行动画或滑动时,fps的值直接反映出滑动的流通程度
  2. 调试选项

四、调试、优化

1、Color Blended Layers

(1)、图层混合

首先咱们要明白像素的概念,屏幕上每一个点都是一个像素,像素有R、G、B三种色彩构成(有时分还带有alpha值)。假如某一块区域上覆盖了多个layer,最后的显现作用受到这些layer的一起影响。举个比如,上层是蓝色(RGB=0,0,1),透明度为50%,下层是赤色(RGB=1,0,0)。那么最终的显现作用是紫色(RGB=0.5,0,0.5)。这种色彩的混合(blending)需求耗费必定的GPU资源,由于实际上或许不止只有两层。假如只想显现最上层的蓝色,能够把它的透明度设置为100%,这样GPU会疏忽下面一切的layer,然后节约了许多不必要的运算。

(2)、调试Color Blended Layers

第一个调试选项”Color Blended Layers”正是用于检测哪里发生了图层混合,并用赤色符号出来。因而咱们需求尽或许减少看到的赤色区域。一旦发现应该想法设法消除它。开端调试后勾选这个选项,咱们在手机上能够看到如下的场景:

02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用

重要的是backgroundColor特点,假如不设置这个特点,控件仍然被认为是透明的,所以咱们做的第一个优化是设置控件的backgroundColor特点。

PS:假如label文字有中文,仍然会呈现图层混合,这是由于此刻label多了一个sublayer。

2、Color Hits Green and Misses Red

(1)、光栅化

光栅化是将一个layer预先烘托成位图(bitmap),然后加入缓存中。假如关于暗影作用这样比较耗费资源的静态内容进行缓存,能够得到必定起伏的功能提高。demo中的这一行代码表明将label的layer光栅化:


label.layer.shouldRasterize = YES;

(2)、调试Color Hits Green and Misses Red

第二个调试选项是“Color Hits Green and Misses Red”,它表明假如射中缓存则显现为绿色,不然显现为赤色,显然绿色越多越好,赤色越少越好。

留意:光栅化的中心在于缓存的思想。咱们自己动手把玩一下,能够发现以下几个有意思的现象:

  1. 上下细小起伏滑动时,一直是绿色
  2. 上下较大起伏滑动,新呈现的label一开端是赤色,随后变成绿色
  3. 假如停止一秒钟,刚开端滑动时会变红。

这是由于layer进行光栅化后烘托成位图放在缓存中。当屏幕呈现滑动时,咱们直接从缓存中读取而不必烘托,所以会看到绿色。当新的label呈现时,缓存中没有个这个label的位图,所以会变成赤色。第三点比较要害,缓存中的对象有用期只有100ms,即假如在0.1s内没有被运用就会主动从缓存中整理出去。这就是为什么逗留一瞬间再滑动就会看到赤色。

光栅化的缓存机制是一把双刃剑,先写入缓存再读取有或许耗费较多的时刻。因而光栅化仅适用于较杂乱的、静态的作用。经过Instrument的调试发现,这儿运用光栅化经常呈现未射中缓存的状况,假如没有特殊需求则能够封闭光栅化,所以咱们做的第二个优化是注释掉下面这行代码

//    label.layer.shouldRasterize = true

3、Color Copied Images

(1)、色彩格局

像素在内存中的布局和它在磁盘中的存储办法并不相同。考虑一种简略的状况:每个像素有R、G、B和alpha四个值,每个值占用1字节,因而每个像素占用4字节的内存空间。一张1920*1080的照片(iPhone6 Plus的分辨率)一共有2,073,600个像素,因而占用了超过8Mb的内存。但是一张同样分辨率的PNG格局或JPEG格局的图片一般状况下不会有这么大。这是由于JPEG将像素数据进行了一种非常杂乱且可逆的转化。

CPU首要处理两件事:

  • (1)把图片从PNG或JPEG等格局中解压出来,得到像素数据
  • (2)假如GPU不支撑这种色彩各式,CPU需求进行格局转化

比方运用中有一些从网络下载的图片,而GPU恰好不支撑这个格局,这就需求CPU预先进行格局转化。

(2)、调试Color Copied Images

第三个选项“Color Copied Images”就用来检测这种实时的格局转化,假如有则会将图片符号为蓝色。

4、Color Misaligned Images

(1)、图片巨细

在项目中,咱们网络恳求图片,巨细不一,但是展现的UIImageView有时分是固定巨细。这时分咱们就需求图片的缩放了。图片的缩放需求占用时刻,因而咱们要尽或许保证无论是本地图片仍是从网络或取得图片的巨细,都与其frame保持共同。

(2)、调试Color Misaligned Images

第五个选项“Color Misaligned Images”,它表明假如图片需求缩放则符号为黄色,假如没有像素对齐则符号为紫色。勾选上这个选项并进行调试,能够看到如下场景:

02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用

5、Color Offscreen-Rendered Yellow

(1)、离屏烘托

离屏烘托表明烘托发生在屏幕之外。离屏烘托意味着把烘托成果临时保存,等用届时再取出,因而相关于一般烘托更占用资源。

(2)、调试Color Offscreen-Rendered Yellow

第六个选项“Color Offscreen-Rendered Yellow”会把需求离屏烘托的当地符号为黄色,大部分状况下咱们需求尽或许防止黄色的呈现。离屏烘托或许会主动触发,也能够手动触发。以下状况或许会导致触发离屏烘托:

  1. 重写drawRect办法;(主动触发离屏烘托)
  2. 有mask或者是暗影(layer.masksToBounds, layer.shadow),含糊作用也是一种mask;(主动触发离屏烘托)
  3. layer.shouldRasterize = true;(手动开启离屏烘托)

开端调试并勾选“Color Offscreen-Rendered Yellow”,会看到这样的场景:

02-iOS性能优化|性能调试工具Instruments-CoreAnimation使用

能够看到tabbar和statusBar也是黄色,这是由于它们运用了含糊作用。 假如图片运用了暗影,也是黄色,这说明它也进行了离屏烘托,解决方案,在设置暗影作用的四行代码下面添加一行:

imgView.layer.shadowPath = UIBezierPath(rect: imgView.bounds).CGPath

这行代码拟定了暗影途径,假如没有手动指定,Core Animation会去主动核算,这就会触发离屏烘托。假如人为指定了暗影途径,就能够免除核算,然后防止产生离屏烘托。

设置cornerRadius自身并不会导致离屏烘托,但许多时分它还需求合作layer.masksToBounds = true运用。依据之前的总结,设置masksToBounds会导致离屏烘托。解决方案是尽或许在滑动时防止设置圆角,假如有必要设置圆角,能够运用光栅化技术将圆角缓存起来:

1. // 设置圆角
2. label.layer.masksToBounds = true  
3. label.layer.cornerRadius = 8  
4. label.layer.shouldRasterize = true  
5. label.layer.rasterizationScale = layer.contentsScale 

6、Color Compositing Fast-Path Blue

(1)、快速途径

离屏烘托的最后一步是把此前的多个途径组合起来。假如这个组合过程能由CPU完成,就会很多减少GPU的作业。这种技术在绘制地图中或许用到。

(2)、调试Color Compositing Fast-Path Blue

第七个选项“Color Compositing Fast-Path Blue”用于符号由硬件绘制的途径,蓝色越多越好。

7、Flash updated Regions

(1)、改变区域

改写视图时,咱们应该把需求重绘的区域尽或许缩小。关于未发生改变的内容则不应该重绘。

(2)、调试Flash updated Regions

第八个选项“Flash updated Regions”用于符号发生重绘的区域。

五、总结

1、防止图层混合

  • ①、保证控件的opaque特点设置为true,保证backgroundColor和父视图色彩共同且不透明;
  • ②、如无特殊需求,不要设置低于1的alpha值;
  • ③、保证UIImage没有alpha通道;

2、防止临时转化

  • ①、保证图片巨细和frame共同,不要在滑动时缩放图片;
  • ②、保证图片色彩格局被GPU支撑,防止劳烦CPU转化;

3、慎用离屏烘托

  • ①、绝大多数时分离屏烘托会影响功能;
  • ②、重写drawRect办法,设置圆角、暗影、含糊作用,光栅化都会导致离屏烘托;
  • ③、设置暗影作用是加上暗影途径;
  • ④、滑动时若需求圆角作用,开启光栅化;

总结

本文 简略介绍了 项目 功能调试东西 Instruments 的根本运用,目前只对CoreAnimation调试这一块 做了简略介绍 。
接下来会用几篇文章,环绕几个常见的功能问题,展开对 功能调试东西 Instrument 的 其它模块的运用介绍。

相关系列文章

Instruments

  • 01-iOS功能优化|功能调试东西Instruments简略介绍
  • 02-iOS功能优化|功能调试东西Instruments-CoreAnimation运用
  • 03-iOS功能优化|功能调试东西Instruments-Leaks东西运用
  • 04-iOS功能优化|功能调试东西Instruments-Allocations东西运用 其它功能指标的重视
  • 05-iOS功能优化|常见的几个功能指标要害:页面卡顿、离屏烘托、耗电优化、App启动优化、安装包瘦身
  • 06-iOS功能优化|功能指标监测