亿万先生官方网站:属性优化就变成不可或缺的一些,性能优化就改成不可缺失的某些

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 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,所以首先种方法可以直接忽略掉。

采取第三种格局您会发现此前青色的都消除掉了。
亿万先生官方网站: 1
安装不透明从前
亿万先生官方网站: 2
设置不透明之后

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

到那里您或许想不到。设置label的背景观第一行不就够了么。为啥还有第二行?那是出于假若label的内容是中文。label实际渲染区域要大于label的size,最外层多了一个sublayer,要是不设置第二行label的边缘外层灰出现图层混合的庚戌革命,因而必须在label内容是普通话的景况下加第二句。单独行使label.layer.masksToBounds
= YES是不会爆发离屏渲染,下文会讲离屏渲染。
注意点:UIImageView控件比較特殊。不仅须求自身这么些容器是不透明的,而且imageView包含的内容图片也亟须是不透明的,如果你自己的图样出现了图层混合紫色,先反省是不是自己的代码有题目,如果确认代码没问题。就是图片自身的题目。可以联系你们的UI眉眉~

Color Compositing 法斯特-Path Blue (飞速路径)

Places a blue overlay over content that is detached from the
compositor.标记由硬件绘制的不二法门为红色,青色越来越多越好,可以对一直运用OpenGL绘制的图层举行高亮。没有对OpenGL有过多的钻研,所以这边不可以给出demo,大家只须要记住藏蓝色更加多越好就ok。

未雨绸缪工作

在性质优化中一个最具參考价值的特性是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:
亿万先生官方网站: 3
打开CoreAnimation
亿万先生官方网站: 4
CoreAnimation调试界面
图中1是FPS值。

图中2是例外纬度的调试选项(以下会相继介绍)。

Color Hits Green and Misses Red(光栅化)

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 Immediately(颜色刷新频率)

当执行颜色刷新的时候移除10ms的延迟,因为可能在一定情景下你不必要这几个延迟,所以采纳此选项加速颜色刷新的成效。可是貌似那么些调试选项大家是用不到的。

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重绘刷新的一种情景。而且你可见发现色情区域至极小,区域越小性能越好。
亿万先生官方网站: 5好了,花了几天的生机毕竟写完了~对Core
Animation的装有调试选项也都表达了,若是你能在类型中合理使用。对App的性质进步一定不足小视。当然那是对准试图的调试形式,作用代码的规划是否合理也是震慑属性越发关键的一头。
自己才疏学浅。如有疏漏敬请评论指正,一块学习发展。假如你对以为对您有支持欢迎点个赞哈~谢谢。

iOS开发学习沟通qq群: 529560119

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 Immediately(颜色刷新频率)

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

当App发展到自然的范畴,性能优化就改为须要的少数。可是众三个人,又对性能优化很陌生,毕竟平时大致岁月都在写作业逻辑,很少关怀这几个。近日在优化自己的系列,也采访了众多素材,那里先浅谈一下选用Instruments中CoreAnimation优化收获的经验以及计算,那是第一篇,后续会更新提姆er
Profiler,Leaks等任何优化工具的切切实实用法。

Color Compositing 法斯特(Fast)-Path Blue (高速路径)

Places a blue overlay over content that is detached from the
compositor.标记由硬件绘制的门道为蓝色,黄色愈来愈多越好,可以对平昔运用OpenGL绘制的图层举行高亮。没有对OpenGL有过多的商讨,所以那里无法给出demo。我们只是须求记住紫色越来越多越好就ok。

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

本条调试选项没有一篇博文讲过,都是直接略过,我也尝尝很多路线去找那个选项到底是怎样效能,然则苹果支付文档以及stackOverFlow都未曾对这一个富有解释。自己真机调试尝试了好多发觉有个规律,就是开拓那个选项,某些Label和Button的背景颜色都会油然则生银白色,可是不是必先现的,有些Label和Button如故正常颜色背景。其他ImageView等控件是不会并发银白色的背景颜色,臆想是不是和文本Text的安装有关系。如若您对那些装有领会,欢迎研商。

Color Non-Standard Surface Formats调试效果

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

以此调试选项没有一篇博文讲过,都是直接略过,我也尝试相当多途径去找那些选项究竟是如何效果,但是苹果支付文档以及stack
overflow都没有对那个具有解释。自己真机调试尝试了相当多发现有个规律,就是开辟那个选项。某些Label和Button的背景颜色都会冒出银白色。但是不是必先现的。有些Label和Button如故正常颜色背景。

其他ImageView等控件是不会产出银白色的背景颜色,算计是不是和文本Text的安装有提到。即使你对这一个拥有精通。欢迎琢磨。
亿万先生官方网站: 6

以此选项重如若检测大家是是否科学使用layer的shouldRasterize属性,shouldRasterize

YES开启光栅化。什么是光栅化?光栅化是将一个layer预先渲染成位图(bitmap),再加入到缓存中,成功被缓存的layer会标注为紫色,没有大功告成缓存的会标明为粉色,正确行使光栅化可以赢得肯定程度的性能升高。
适用情形:一般在图像内容不变的情事下才使用光栅化,例如设置阴影开销资源相比较多的静态内容,假若选用光栅化对性能的升级换代有自然救助。
非适用情况:假如情节会不时改变,那些时候绝不开启,否则会造成性能的浪费。例如大家在运用tableViewCell中,一般不要用光栅化,因为tableViewCell的绘图非凡频仍,内容在持续的变迁,要是运用了光栅化,会导致大气的离屏渲染下落性能。
借使你在一个界面中选取了光栅化,刚进去这些页面的拥有应用了光栅化的控件layer都会是革命,因为还未曾缓存成功,如若前后滑动你会意识,layer变成了灰色。然而一旦你滑动幅度较大会发现,新面世的控件会是新民主主义革命然后改成粉色,因为刚初阶那个控件的layer还并未缓存。
注意点:
(1)系统给光栅化缓存分配了一个固定的尺寸,由此不可能过度使用,假如超出了缓存也会造成离屏渲染。
(2)缓存的日子为100ms,由此假诺在100ms内没有采用缓存的目的,则会从缓存中消除。

Color Misaligned Images(图片大小)

其一选项可以协理大家查阅图片大小是否正确显示。假诺image size和imageView
size不包容,image会出现粉红色。要尽量的下跌粉红色的现身,由于image
size与imageView size不匹配,会消耗资源裁减图片。

下图中的image实际size(81,110)。顶部image正常,底部image现身紫色由于位于了一个size
x 2的imageView容器中。
亿万先生官方网站: 7

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,提供各个最新权威学习书本及开发录像

亿万先生官方网站: 8
简书地址:http://www.jianshu.com/users/6cb2622d5eac/latest_articles
当App发展到早晚的规模。性能优化就改为不可缺失的某些。不过尤其几个人,又对性能优化格外陌生,毕竟日常大多小时都在写作业逻辑,卓殊少关注这些。如今在优化自己的体系。也采访了丰富多材料,那里先浅谈一下采纳Instruments中CoreAnimation优化收获的经历以及总计,那是率先篇,兴许会更新提姆(Tim)er
Profiler,Leaks等此外优化工具的详细使用方法。

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 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设置了圆角,触发离屏渲染:
亿万先生官方网站: 9为了尽量幸免触发离屏渲染。我们可以换其余手段来促成须求的功效:
(1)阴影绘制shadow:使用ShadowPath来替代shadowOffset等性能的安装
imageViewLayer.shadowPath = CGPathCreateWithRect(imageRect, NULL);
(2)利用GraphicsContex生成一张带圆角的图形或者view,那里不写详细完结进度,必要的能够度娘Copy,万分多现成的代码。

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

其一选项紧即使检測我们是是否正确行使layer的shouldRasterize属性。shouldRasterize
= YES开启光栅化。

什么样是光栅化?光栅化是将一个layer预先渲染成位图(bitmap),再充实到缓存中,成功被缓存的layer会标注为粉色,没有水到渠成缓存的会标注为粉色。正确运用光栅化可以收获一定程度的属性提高。

适用意况:一般在图像内容不变的气象下才使用光栅化,比如设置阴影开支资源比較多的静态内容,如果使用光栅化对性能的升级换代有必然救助。
非适用情状:借使内容会时时转移,那个时候绝不开启,否则会促成性能的浪费。比如大家在采取tableViewCell中,一般不要用光栅化,由于tableViewCell的绘图分外频仍。内容在不停的更动。若是使用了光栅化,会促成大量的离屏渲染下跌性能。
一旦你在一个界面中运用了光栅化,刚进入这么些页面的有着应用了光栅化的控件layer都会是丁丑革命。由于还一向不缓存成功。借使上下滑动你会发觉,layer变成了黑色。

但是若是你滑动幅度较大会发现,新面世的控件会是蓝色然后改成藏蓝色,由于刚開始这么些控件的layer还一直不缓存。
注意点:
(1)系统给光栅化缓存分配了一个稳住的轻重。由此不能够过度使用,即使超出了缓存也会导致离屏渲染。
(2)缓存的小运为100ms。由此假诺在100ms内尚未应用缓存的靶子,则会从缓存中革除。
亿万先生官方网站: 10

预备干活

在性能优化中一个最具参考价值的特性是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是例外纬度的调试选项(上边会挨个介绍)。

相关文章

网站地图xml地图