Instruments性能优化-Core Animation随便记,关于iOS性能优化。

当App发展到一定之范畴,性能优化就改为必备的某些。但是众多丁,又对性优化很陌生,毕竟平常差不多年华还在描写作业逻辑,很少关心这。最近当优化自己的类,也采访了诸多素材,这里先浅谈一下以Instruments中CoreAnimation优化收获的经历与总,这是第一首,后续会更新Timer
Profiler,Leaks等另外优化工具的切切实实用法。

CoreAnimation用于测应用之图纸性能和经过的CPU使用率。
所以来监测CoreAnimation性能。它提供了周期性的FPS,并且考虑到了起在次外的卡通片。

未雨绸缪干活

在性能优化中一个无限具有参考价值的性是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凡差纬度的调节选项(下面会相继介绍)。

FPS凡因屏幕的刷新率,也即是每秒钟显示小帧画面。iPhone推荐的刷新率是60Hz,也就是说在页面执行动画或者说是滑动的时光,每秒钟显示60帧的镜头。页面静止的上FPS值为0。FPS值的尺寸反映了页面的流利程度,当FPS低于45之时段卡顿会见于显然。

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(光栅化)

(1)在利用CoreAnimation工具进行测试的当儿如果使真机来进行测试。如果选模拟器则会报错(Core
Animation does not support the iOS Simulator platform)
(2)最好下release模式

斯选项主要是检测我们是是否对利用layer的shouldRasterize属性,shouldRasterize

YES开启光栅化。什么是光栅化?光栅化是用一个layer预先渲染成位图(bitmap),再参加到缓存中,成功让缓存的layer会标注为绿色,没有成缓存的会见标注为革命,正确行使光栅化可以博肯定水准的性能提升。
适用情形:一般以图像内容无变换的情景下才以光栅化,例如设置阴影耗费资源比较多之静态内容,如果应用光栅化对性能的升官有早晚救助。
勿适用情形:如果情节会时常转移,这个时绝不开,否则会导致性能的荒废。例如我们以运用tableViewCell中,一般不要因此光栅化,因为tableViewCell的绘图非常累,内容以不断的变通,如果利用了光栅化,会导致大气的离屏渲染降低性能。
只要您以一个界面被使用了光栅化,刚进是页面的具备以了光栅化的控件layer都见面是红,因为还无缓存成功,如果前后滑动你见面发觉,layer变成了绿色。但是要您滑动幅度较大会发现,新出现的控件会是红色然后改成绿色,因为正开头这些控件的layer还尚无缓存。
注意点:
(1)系统被光栅化缓存分配了一个恒定的大大小小,因此无可知过度用,如果超过了缓存也会促成离屏渲染。
(2)缓存的光阴也100ms,因此如果在100ms内没有采用缓存的目标,则会自缓存中排除。

图片 1

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)。

CoreAnimation调试界面

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

是调试选项没有同首博文称过,都是直接略过,我吧尝多路线去寻觅这选项到底是呀作用,然而苹果支付文档以及stackOverFlow都没指向这个拥有解释。自己真机调试尝试了不少意识有只规律,就是开辟这选项,某些Label和Button的背景颜色都见面现出雪白色,但是未是大势所趋先现的,有些Label和Button依然正常颜色背景。其他ImageView等控件是匪见面并发雪白色的背景颜色,猜想是无是跟文本Text的装有提到。如果你对这个装有了解,欢迎讨论。

Color Non-Standard Surface Formats调试效果

CoreAnimation常用之调节选项

  • Color Blended Layers(图层混合)

广大情景下,我们的界面都是碰头出现多单UI控件叠加的场面,如果上层之控件是晶莹的要半透明底,那么GPU就会错过算这些layer最终的显示颜色,也即是咱如常看到底机能。例如上层一个UIView的背景色是蓝色半晶莹剔透,下层发生一个革命的UIView,GPU就会见活动计算两只UIView重叠区域之水彩。如果我们管上层的UIView设置为不透明,那么即便会见直接显示为蓝色,不用计算重叠部分的颜料。

倘出现了图层混合,打开Color Blended Layers选择,发生叠的UIView会显示也红,我们的目的是竭尽的削减红色的区域。一般要设置控件不透明即可,通常为控件一个休透明底背景色(例如白色)。

然而于显示的内容产生中文的Label,只设置背景色是不够的,因为一旦label的情来中文的话,label的莫过于渲染区域要大于label的size,最外层多矣一个sublayer,需要加上label.layer.masksToBounds = YES

  • Color Hits Green and Misses Red(光栅化)

夫选项主要是检测我们是否科学的使了layer的shouldRasterize属性,shouldRasterize = YES开启光栅化。光栅化是拿一个layer预先渲染成位图,再加入到缓存中,成功为缓存的layer会标注为绿色,没有成缓存的会晤给标明为红色,正确的采用光栅化可以博得一定水平的性质提升。

启用shouldRasterize属性会将图层绘制到一个屏幕外的图像。然后是图像将会晤受缓存起来并绘制到骨子里图层的contents和子图层。如果产生为数不少的子图层或者出复杂的效果使,这样做就会比重绘有事情的保有帧划得来得多。但是光栅化原始图像需要时刻,而且还会消耗额外的内存。因此光栅化仅适用于比复杂的、静态的机能。例如设置阴影等吃资源比较多之静态内容。如果没异样的待,关闭光栅化也是平种优化。

  • Color Misaligned Images(图片的未正常缩放)

此选项可以帮助我们查阅图片大小是否对显示。如果image size和imageView
size不配合,image会出现黄色。要尽量的削减黄色的面世,因为image
size与imageView size不般配,会消耗资源减少图片。

  • Color Offscreen-Rendered Yellow(离屏渲染)

离屏渲染倚的是GPU在现阶段屏幕缓冲区以外新开拓一个缓冲区进行渲染操作。还有另外一种屏幕渲染方式-当前屏幕渲染On-Screen
Rendering ,指的是GPU的渲染操作是以脚下用于展示的屏幕缓冲区中展开。
离屏渲染会预先以屏幕外创建新缓冲区,离屏渲染了晚,再打去屏切到眼前屏幕,
把离屏的渲染结果显示到当下屏幕及,这个上下文切换的过程是好耗性能的,实际支出中尽量避免离屏渲染。
会触发离屏渲染的行:
(1)设置圆角(当跟maskToBounds一起用时)
(2)设置阴影
(3)layer.shouldRasterize(光栅化)
(4)layer.mask
以出现离屏渲染的情事下,优先考虑避免触发离屏渲染,设置阴影可以通过点名shadowPath来避免离屏渲染。在无法取消离屏渲染之事态下有少数种方案展开优化:
(1)layer.shouldRasterize(光栅化)适用于静态内容之视图,对点的有所机能而言,在促成资金以及性能达到是最最均衡的。
(2)主动回避离屏渲染(用其他不见面时有发生离屏渲染之法子实现效益)

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

相关文章

发表评论

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