当App发展到一定的范畴,性能优化就成为必要的少数。可是众两个人,又对性能优化很生疏,毕竟平日差不多岁月都在写作业逻辑,很少关心这多少个。近期在优化自己的连串,也采集了重重资料,这里先浅谈一下应用Instruments中CoreAnimation优化收获的阅历以及总计,这是第一篇,后续会更新提姆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)缓存的年Motorola100ms,因而只要在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,提供各样新型权威学习书本及开发录像

发表评论

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

网站地图xml地图