Instruments性能优化-Core Animation

当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凡是殊纬度的调节选项(下面会挨个介绍)。

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-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,提供各种新颖权威学习书本和开发视频

Leave a Comment.