【金沙澳门官网jin5888】Instruments性能优化,性能优化

【金沙澳门官网jin5888】Instruments性能优化,性能优化。当App发展到一定的规模,性能优化就成为必不可少的一点。但是很多人,又对性能优化很陌生,毕竟平常大多时间都在写业务逻辑,很少关注这个。最近在优化自己的项目,也收集了很多资料,这里先浅谈一下使用Instruments中CoreAnimation优化收获的经验以及总结,这是第一篇,后续会更新Timer
Profiler,Leaks等其他优化工具的具体用法。

金沙澳门官网jin5888 1
简书地址:
当App发展到一定的规模。性能优化就成为不可缺少的一点。可是非常多人,又对性能优化非常陌生,毕竟寻常大多时间都在写业务逻辑,非常少关注这个。近期在优化自己的项目。也收集了非常多资料,这里先浅谈一下使用Instruments中CoreAnimation优化收获的经验以及总结,这是第一篇,兴许会更新Timer
Profiler,Leaks等其它优化工具的详细使用方法。

向原创作者致敬 :

准备工作

在性能优化中一个最具参考价值的属性是FPS:全称Frames Per
Second,其实就是屏幕刷新率,苹果的iphone推荐的刷新率是60Hz,也就是说GPU每秒钟刷新屏幕60次,这每刷新一次就是一帧frame,FPS也就是每秒钟刷新多少帧画面。静止不变的页面FPS值是0,这个值是没有参考意义的,只有当页面在执行动画或者滑动的时候,FPS值才具有参考价值,FPS值的大小体现了页面的流畅程度高低,当低于45的时候卡顿会比较明显。
注意点:
(1)使用真机调试。
(2)最好使用release包测试(release是发布版本,苹果会在release包中做很多优化工作,因此用release包测试出来的性能才是最真实的)。

启动程序点击XCode选择左上角-XCode->Open Developer Tool
->Instruments,打开Instruments再选择CoreAnimation:

打开CoreAnimation

CoreAnimation调试界面

图中1是FPS值。
图中2是不同纬度的调试选项(下面会逐个介绍)。

准备工作

【金沙澳门官网jin5888】Instruments性能优化,性能优化。在性能优化中一个最具參考价值的属性是FPS:全称Frames Per
Second,事实上就是屏幕刷新率,苹果的iphone推荐的刷新率是60Hz,也就是说GPU每秒钟刷新屏幕60次,这每刷新一次就是一帧frame,FPS也就是每秒钟刷新多少帧画面。精巧不变的页面FPS值是0,这个值是没有參考意义的。仅仅有当页面在运行动画或者滑动的时候。FPS值才具有參考价值。FPS值的大小体现了页面的流畅程度高低。当低于45的时候卡顿会比較明显。
注意点:
(1)使用真机调试。

(2)最好使用release包測试(release是公布版本号。苹果会在release包中做非常多优化工作,因此用release包測试出来的性能才是最真实的)。
启动程序点击XCode选择左上角-XCode->Open Developer Tool
->Instruments,打开Instruments再选择CoreAnimation:
金沙澳门官网jin5888 2
打开CoreAnimation
金沙澳门官网jin5888 3
CoreAnimation调试界面
图中1是FPS值。

【金沙澳门官网jin5888】Instruments性能优化,性能优化。图中2是不同纬度的调试选项(以下会逐个介绍)。

启动程序点击XCode选择左上角-XCode->Open Developer Tool
->Instruments,打开Instruments再选择CoreAnimation:

Color Blended Layers (图层混合)

这个选项是检测哪里发生了图层混合,先介绍一下什么是图层混合?很多情况下,界面都是会出现多个UI控件叠加的情况,如果有透明或者半透明的控件,那么GPU会去计算这些这些layer最终的显示的颜色,也就是我们肉眼所看到的效果。例如一个上层Veiw颜色是绿色RGB(0,255,0),下层又放了一个View颜色是红色RGB(0,0,255),透明度是50%,那么最终显示到我们眼前的颜色是蓝色RGB(0,127.5,127.5)。这个计算过程会消耗一定的GPU资源损耗性能。如果我们把上层的绿色View改为不透明,
那么GPU就不用耗费资源计算,直接显示绿色。混合颜色计算公式:

R(C)=alpha*R(B)+(1-alpha)*R(A)    R(x)、G(x)、B(x)分别指颜色x的RGB分量

如果出现图层混合了,打开Color Blended
Layers选项,那块区域会显示红色,所以我们调试的目的就是将红色区域消减的越少越好。那么如何减少红色区域的出现呢?只要设置控件不透明即可。
(1)设置opaque 属性为NO。
(2)给View设置一个不透明的颜色,没有特殊需要设置白色即可。
如果你在lldb中po打印某个控件,你会发现打印出来的数据中,控件的opaque都是NO,因为控件这个属性的默认值都是NO,所以第一种方法可以直接忽略掉。使用第二种方法你会发现之前红色的都消除掉了。

设置不透明之前

设置不透明之后

label.backgroundColor = [UIColor whiteColor];
label.layer.masksToBounds = YES;

到这里你可能奇怪,设置label的背景色第一行不就够了么,为什么还有第二行?这是因为如果label的内容是中文,label实际渲染区域要大于label的size,最外层多了一个sublayer,如果不设置第二行label的边缘外层灰出现图层混合的红色,因此需要在label内容是中文的情况下加第二句。单独使用label.layer.masksToBounds
= YES是不会发生离屏渲染,下文会讲离屏渲染。
注意点:UIImageView控件比较特殊,不仅需要自身这个容器是不透明的,并且imageView包含的内容图片也必须是不透明的,如果你自己的图片出现了图层混合红色,先检查是不是自己的代码有问题,如果确认代码没问题,就是图片自身的问题,可以联系你们的UI眉眉~

Color Blended Layers (图层混合)

这个选项是检測哪里发生了图层混合,先介绍一下什么是图层混合?非常多情况下,界面都是会出现多个UI控件叠加的情况,假设有透明或者半透明的控件。那么GPU会去计算这些这些layer终于的显示的颜色,也就是我们肉眼所示效果。比如一个上层Veiw颜色是绿色RGB(0,255,0),下层又放了一个View颜色是红色RGB(0,0,255),透明度是50%。那么终于显示到我们眼前的颜色是蓝色RGB(0,127.5,127.5)。

这个计算过程会消耗一定的GPU资源损耗性能。假设我们把上层的绿色View改为不透明,
那么GPU就不用耗费资源计算,直接显示绿色。

混合颜色计算公式:

R(C)=alpha*R(B)+(1-alpha)*R(A)    R(x)、G(x)、B(x)分别指颜色x的RGB分量

假设出现图层混合了。打开Color Blended
Layers选项,那块区域会显示红色,所以我们调试的目的就是将红色区域消减的越少越好。

那么怎样降低红色区域的出现呢?仅仅要设置控件不透明就可以。
(1)设置opaque 属性为true。

(2)给View设置一个不透明的颜色。没有特殊须要设置白色就可以。
假设你在lldb中po打印某个控件,你会发现打印出来的数据中。控件的opaque都是true。由于控件这个属性的默认值都是true,所以第一种方法能够直接忽略掉。

使用第二种方法你会发现之前红色的都消除掉了。
金沙澳门官网jin5888 4
设置不透明之前
金沙澳门官网jin5888 5
设置不透明之后

label.backgroundColor = [UIColor whiteColor];
label.layer.masksToBounds = YES;

到这里你可能奇怪。设置label的背景色第一行不就够了么。为什么还有第二行?这是由于假设label的内容是中文。label实际渲染区域要大于label的size,最外层多了一个sublayer,假设不设置第二行label的边缘外层灰出现图层混合的红色,因此须要在label内容是中文的情况下加第二句。单独使用label.layer.masksToBounds
= YES是不会发生离屏渲染,下文会讲离屏渲染。
注意点:UIImageView控件比較特殊。不仅须要自身这个容器是不透明的,而且imageView包括的内容图片也必须是不透明的,假设你自己的图片出现了图层混合红色,先检查是不是自己的代码有问题,假设确认代码没问题。就是图片自身的问题。能够联系你们的UI眉眉~

金沙澳门官网jin5888 6

Color Hits Green and Misses Red(光栅化)

Color Hits Green and Misses Red(光栅化)

这个选项主要是检測我们是是否正确使用layer的shouldRasterize属性。shouldRasterize
= YES开启光栅化。

什么是光栅化?光栅化是将一个layer预先渲染成位图(bitmap),再增加到缓存中,成功被缓存的layer会标注为绿色,没有成功缓存的会标注为红色。正确使用光栅化能够得到一定程度的性能提升。

适用情况:一般在图像内容不变的情况下才使用光栅化,比如设置阴影耗费资源比較多的静态内容,假设使用光栅化对性能的提升有一定帮助。
非适用情况:假设内容会经常变动,这个时候不要开启,否则会造成性能的浪费。比如我们在使用tableViewCell中,一般不要用光栅化,由于tableViewCell的绘制非常频繁。内容在不断的变化。假设使用了光栅化,会造成大量的离屏渲染降低性能。
假设你在一个界面中使用了光栅化,刚进去这个页面的所有使用了光栅化的控件layer都会是红色。由于还没有缓存成功。假设上下滑动你会发现,layer变成了绿色。

可是假设你滑动幅度较大会发现,新出现的控件会是红色然后变成绿色,由于刚開始这些控件的layer还没有缓存。
注意点:
(1)系统给光栅化缓存分配了一个固定的大小。因此不能过度使用,假设超出了缓存也会造成离屏渲染。
(2)缓存的时间为100ms。因此假设在100ms内没有使用缓存的对象,则会从缓存中清除。
金沙澳门官网jin5888 7

金沙澳门官网jin5888 8

这个选项主要是检测我们是是否正确使用layer的shouldRasterize属性,shouldRasterize

YES开启光栅化。什么是光栅化?光栅化是将一个layer预先渲染成位图(bitmap),再加入到缓存中,成功被缓存的layer会标注为绿色,没有成功缓存的会标注为红色,正确使用光栅化可以得到一定程度的性能提升。
适用情况:一般在图像内容不变的情况下才使用光栅化,例如设置阴影耗费资源比较多的静态内容,如果使用光栅化对性能的提升有一定帮助。
非适用情况:如果内容会经常变动,这个时候不要开启,否则会造成性能的浪费。例如我们在使用tableViewCell中,一般不要用光栅化,因为tableViewCell的绘制非常频繁,内容在不断的变化,如果使用了光栅化,会造成大量的离屏渲染降低性能。
如果你在一个界面中使用了光栅化,刚进去这个页面的所有使用了光栅化的控件layer都会是红色,因为还没有缓存成功,如果上下滑动你会发现,layer变成了绿色。但是如果你滑动幅度较大会发现,新出现的控件会是红色然后变成绿色,因为刚开始这些控件的layer还没有缓存。
注意点:
(1)系统给光栅化缓存分配了一个固定的大小,因此不能过度使用,如果超出了缓存也会造成离屏渲染。
(2)缓存的时间为100ms,因此如果在100ms内没有使用缓存的对象,则会从缓存中清除。

Color Copied Images(图片颜色格式)

Shows images that are copied by Core Animation in
blue苹果官方凝视被拷贝给CPU进行转化的图片显示为绿色。那么这句话怎么理解呢?假设GPU不支持当前图片的颜色格式。那么就会将图片交给CPU预先进行格式转化,而且这张图片标记为蓝色。

那么GPU支持什么格式呢?苹果的GPU仅仅解析32bit的颜色格式。假设使用Color
Copied Images去调试发现是蓝色,这个时候你也能够去找你们的UI眉眉了~
知识扩展:32bit指的是图片颜色深度。用“位”来表示,用来表示显示颜色数量,比如一个图片支持256种颜色。那么就须要256个不同的值来表示不同的颜色,也就是从0到255,二进制表示就是从00000000到11111111。一共须要8位二进制数。所以颜色深度是8。

通常32bit色彩中使用三个8bit分别表示R红G绿B蓝,另一个8bit经常使用来表示透明度(Alpha)。

1是fps  2是调试选项

Color Copied Images(图片颜色格式)

Shows images that are copied by Core Animation in
blue苹果官方注释被拷贝给CPU进行转化的图片显示为绿色。那么这句话怎么理解呢?如果GPU不支持当前图片的颜色格式,那么就会将图片交给CPU预先进行格式转化,并且这张图片标记为蓝色。那么GPU支持什么格式呢?苹果的GPU只解析32bit的颜色格式,如果使用Color
Copied Images去调试发现是蓝色,这个时候你也可以去找你们的UI眉眉了~
知识扩展:32bit指的是图片颜色深度,用“位”来表示,用来表示显示颜色数量,例如一个图片支持256种颜色,那么就需要256个不同的值来表示不同的颜色,也就是从0到255,二进制表示就是从00000000到11111111,一共需要8位二进制数,所以颜色深度是8。通常32bit色彩中使用三个8bit分别表示R红G绿B蓝,还有一个8bit常用来表示透明度(Alpha)。

Color Non-Standard Surface Formats (不标准的表面颜色格式)

这个调试选项没有一篇博文讲过,都是直接略过,我也尝试非常多途径去找这个选项究竟是什么作用,然而苹果开发文档以及stack
overflow都没有对这个有所解释。自己真机调试尝试了非常多发现有个规律,就是打开这个选项。某些Label和Button的背景颜色都会出现银白色。可是不是必先现的。有些Label和Button依旧正常颜色背景。

其它ImageView等控件是不会出现银白色的背景颜色,猜想是不是和文本Text的设置有关系。假设您对这个有所了解。欢迎讨论。
金沙澳门官网jin5888 9

调试选项介绍:

Color Non-Standard Surface Formats (不标准的表面颜色格式)

这个调试选项没有一篇博文讲过,都是直接略过,我也尝试很多途径去找这个选项到底是什么作用,然而苹果开发文档以及stackOverFlow都没有对这个有所解释。自己真机调试尝试了很多发现有个规律,就是打开这个选项,某些Label和Button的背景颜色都会出现银白色,但是不是必先现的,有些Label和Button依然正常颜色背景。其他ImageView等控件是不会出现银白色的背景颜色,猜想是不是和文本Text的设置有关系。如果您对这个有所了解,欢迎讨论。

Color Non-Standard Surface Formats调试效果

Color Immediately(颜色刷新频率)

当运行颜色刷新的时候移除10ms的延迟。由于可能在特定情况下你不须要这些延迟,所以使用此选项加快颜色刷新的频率。只是一般这个调试选项我们是用不到的。

选项一:Color Blended Layers (图层混合)

相关文章