Instruments性能优化-Core Animation

当App发展到一定的层面,性能优化就变成必不可少的一些。不过过两人,又对性能优化很生疏,毕竟平时差不多岁月都在写作业逻辑,很少关心这几个。如今在优化自己的体系,也采集了众多资料,这里先浅谈一下应用Instruments中CoreAnimation优化收获的阅历以及总括,这是第一篇,后续会更新提姆(Tim)er
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是见仁见智纬度的调试选项(下边会相继介绍)。

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 Hits Green and Misses Red(光栅化)

那些选项首假使检测我们是是否科学利用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)。

Color Non-Standard Surface Formats (不专业的外部颜色格式)

其一调试选项没有一篇博文讲过,都是直接略过,我也尝试很多途径去找这些选项到底是怎么效率,但是苹果支付文档以及stackOverFlow都并未对这多少个装有解释。自己真机调试尝试了好多发觉有个规律,就是开拓这多少个选项,某些Label和Button的背景颜色都会并发银白色,然则不是必先现的,有些Label和Button依旧正常颜色背景。其他ImageView等控件是不相会世银白色的背景颜色,算计是不是和文本Text的设置有关联。要是您对那么些具有了然,欢迎研究。

Color Non-Standard Surface Formats调试效果

Color Immediately(颜色刷新频率)

当执行颜色刷新的时候移除10ms的推移,因为可能在一定情景下你不需要这多少个延迟,所以使用此选项加快颜色刷新的功效。不过貌似这一个调试选项大家是用不到的。

Color Misaligned Images(图片大小)

本条选项可以帮衬我们查阅图片大小是否科学显示。倘若image size和imageView
size不匹配,image会出现褐色。要尽可能的滑坡棕色的面世,因为image
size与imageView
size不兼容,会损耗资源缩小图片。下图中的image实际size(81,110),顶部image正常,底部image出现绿色因为身处了一个size
x 2的imageView容器中。

Color Misaligned Images调试效果图

Color Offscreen-Rendered Yellow(离屏渲染)

离屏渲染Off-Screen Rendering
指的是GPU在当前屏幕缓冲区以外新开发一个缓冲区举办渲染操作。还有此外一种屏幕渲染形式-当前屏幕渲染On-Screen
Rendering ,指的是GPU的渲染操作是在时下用于呈现的屏幕缓冲区中展开。
离屏渲染会先在屏幕外创设新缓冲区,离屏渲染截至后,再从离屏切到近来屏幕,
把离屏的渲染结果呈现到眼前屏幕上,这多少个上下文切换的长河是非凡消耗性能的,实际支付中尽量避免离屏渲染。
触发离屏渲染Offscreen rendering的表现:
(1)drawRect:方法
(2)layer.shadow
(3)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
(4)layer.shouldRasterize
(5)layer.mask
(6)layer.masksToBounds && layer.cornerRadius
那里有亟待专注的是第三条layer.shouldRasterize
,其实就是我们本文讲的第五个拔取光栅化,光栅化会触发离屏渲染,因而光栅化慎用。
第六条设置圆角会触发离屏渲染,如果在某个页面大量运用了圆角,会丰盛消耗性能造成FPS急剧下降,设置圆角触发离屏渲染要同时满足下面多少个原则:

layer.masksToBounds = YES;
layer.cornerRadius = 5;

下图是给一个label设置了圆角,触发离屏渲染:

离屏渲染效果图.jpg

为了尽量避免触发离屏渲染,我们得以换另外手段来促成必要的功能:
(1)阴影绘制shadow:使用ShadowPath来替代shadowOffset等属性的装置
imageViewLayer.shadowPath = CGPathCreateWithRect(imageRect, NULL);
(2)利用GraphicsContex生成一张带圆角的图纸或者view,这里不写具体落实过程,需要的可以度娘Copy,很多现成的代码。

Color Compositing Fast(Fast)-Path Blue (快捷路径)

Places a blue overlay over content that is detached from the
compositor.标记由硬件绘制的门径为紫色,红色越多越好,可以对一向运用OpenGL绘制的图层举行高亮。没有对OpenGL有过多的钻研,所以这里没办法给出demo,大家只需要牢记肉色越多越好就ok。

Flash Updated Regions (重绘区域)

Colors regions on your iOS device in yellow when those regions are
updated by the graphics
processor.那么些选项会对重绘的始末高亮成青色,重绘就是指使用Core
Graphics绘制,绘制会耗费一定的性质,由此重绘区域应该越小越好。下图是用真机进入原生地图打开Flash
Updated Regions
调试的功效图,很心痛截屏无法截到色情的区域,由此我用红框圈起来,一共两处,坐上角的是在不停的刷新页面,右下角是在不停的基础代谢当前职务,由此都是拔取Core
Graphics重绘刷新的一种现象,并且你可以发现色情区域很小,区域越小性能越好。

Flash Updated Regions开启地图效果图

好了,花了几天的肥力毕竟写完了~对Core
Animation的百分之百调剂选项也都讲师了,假若您能在档次中客观利用,对App的特性进步肯定不可轻视。当然这是针对性试图的调剂格局,效率代码的宏图是否创设也是潜移默化属性很首要的单方面。
自身才疏学浅,如有疏漏敬请评论指正,一块学习提高,假设你对认为对你有帮忙欢迎点个赞哈~谢谢。iOS开发技术交换qq群:
529560119,提供各样最新权威学习书本及开发视频

发表评论

电子邮件地址不会被公开。 必填项已用*标注