简书地址:http://www.jianshu.com/users/6cb2622d5eac/latest_articles

当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

imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="CoreAnimation调试界面" title="">

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 属性为true。

(2)给View设置一个不透明的颜色。没有特殊须要设置白色就可以。

假设你在lldb中po打印某个控件,你会发现打印出来的数据中。控件的opaque都是true。由于控件这个属性的默认值都是true,所以第一种方法能够直接忽略掉。

使用第二种方法你会发现之前红色的都消除掉了。



设置不透明之前



设置不透明之后

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 (不标准的表面颜色格式)

这个调试选项没有一篇博文讲过,都是直接略过,我也尝试非常多途径去找这个选项究竟是什么作用,然而苹果开发文档以及stack overflow都没有对这个有所解释。自己真机调试尝试了非常多发现有个规律,就是打开这个选项。某些Label和Button的背景颜色都会出现银白色。可是不是必先现的。有些Label和Button依旧正常颜色背景。

其它ImageView等控件是不会出现银白色的背景颜色,猜想是不是和文本Text的设置有关系。假设您对这个有所了解。欢迎讨论。

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 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设置了圆角,触发离屏渲染:

imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="离屏渲染效果图.jpg" title="">为了尽可能避免触发离屏渲染。我们能够换其它手段来实现必要的功能:

(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重绘刷新的一种场景。而且你能够发现黄色区域非常小,区域越小性能越好。

imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="Flash Updated Regions开启地图效果图" title="">好了,花了几天的精力终于写完了~对Core Animation的所有调试选项也都解说了,假设你能在项目中合理使用。对App的性能提升一定不可小觑。当然这是针对试图的调试方式,功能代码的设计是否合理也是影响性能非常重要的一方面。

本人才疏学浅。如有疏漏敬请评论指正,一块学习进步。假设您对认为对您有帮助欢迎点个赞哈~谢谢。

iOS开发学习交流qq群: 529560119

Instruments性能优化-Core Animation的更多相关文章

  1. Instruments学习之Core Animation学习

    当App发展到一定的规模,性能优化就成为必不可少的一点.但是很多人,又对性能优化很陌生,毕竟平常大多时间都在写业务逻辑,很少关注这个.最近在优化自己的项目,也收集了很多资料,这里先浅谈一下使用Inst ...

  2. Core Animation学习总结

    文件夹: The Layer Beneath The Layer Tree(图层树) The Backing Image(寄宿层) Layer Geometry(图层几何学) Visual Effec ...

  3. iOS Instruments之Core Animation动画性能调优(工具复选框选项介绍)

    Core Animation工具用来监测Core Animation性能.它给我们提供了周期性的FPS,并且考虑到了发生在程序之外的动画(见图12.4) Core Animation工具提供了一系列复 ...

  4. <转>iOS性能优化:Instruments使用实战

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

  5. iOS性能优化:Instruments使用实战

    iOS性能优化:Instruments使用实战   最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instrument ...

  6. [iOS Animation]-CALayer 性能优化

    性能优化 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Animation提供的关于绘制和动画的一些特性.Core Animation功能和性能都非常强大,但如果 ...

  7. iOS - 性能优化:Instruments使用简介

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

  8. EntityFramework Core不得不注意的性能优化意外收获,你会用错?

    前言 这两天在着实研究EF Core项目当中对于一些查询也没实际去检测,于是想着利用放假时间去实际测试下,结果本文就出来了,too young,too simple,后续博主会从底层翻译表达式树弄起, ...

  9. Spark 3.x Spark Core详解 & 性能优化

    Spark Core 1. 概述 Spark 是一种基于内存的快速.通用.可扩展的大数据分析计算引擎 1.1 Hadoop vs Spark 上面流程对应Hadoop的处理流程,下面对应着Spark的 ...

随机推荐

  1. 4455: [Zjoi2016]小星星|状压DP|容斥原理

    OrzSDOIR1ak的晨神 能够考虑状压DP枚举子集,求出仅仅保证连通性不保证一一相应的状态下的方案数,然后容斥一下就是终于的答案 #include<algorithm> #includ ...

  2. 思科模拟器之路由器-RIP-DNS解析server

    思科三层交换机之下的局域网搭建,请看这. 接下来将解说怎样通过路由器的RIP协议来连接多个局域网. 并设置DNSserver. 1.路由器RIP配置 RIP协议有个非常致命的缺点:就是它是依据路径长短 ...

  3. js全选反选按钮实现

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. 微信浏览器的html5页面显示配置等问题汇集 1,禁止微信浏览器分享页面链接 (定点更新)

    公司新需求,要求从安卓IOS应用分享到微信的链接页面不允许二次转发,所以开始编程第一步,上网找资料... 网上大神就是多,不消两分钟,找到方案,很简单,上代码先: wx.config({ debug: ...

  5. pycharm 配置autopep8(亲测可行)

    autopep8是一个可以将Python代码自动排版为PEP8风格第三方包,使用它可以轻松地排版出格式优美整齐的代码.网络上有很多介绍如何在pycharm中配置autopep8的方案,但很多方案中还是 ...

  6.  洛谷 P3056 [USACO12NOV]笨牛Clumsy Cows

    P3056 [USACO12NOV]笨牛Clumsy Cows 题目描述 Bessie the cow is trying to type a balanced string of parenthes ...

  7. SQLite-SQLiteDatabase 数据库实例练习

    今天趁着有时间,自己在网上找了相关的数据库操作代码,进行了一下练习,先上代码 main.xml文件 <RelativeLayout xmlns:android="http://sche ...

  8. Node组装启动过程

    elasticsearch的启动过程是根据配置和环境组装需要的模块并启动的过程.这一过程就是通过guice注入各个功能模块并启动这些模块,从而得到一个功能完整的node.正如之前所说elasticse ...

  9. Spark 概念学习系列之Spark存储管理机制

    Spark存储管理机制 概要 01 存储管理概述 02 RDD持久化 03 Shuffle数据存储 04 广播变量与累加器 01 存储管理概述 思考: RDD,我们可以直接使用而无须关心它的实现细节, ...

  10. css的三种表现形式

    1.行内样式(内嵌样式):结构的内部,即写在标签内的样式:写在标签的开始部分内部,style属性当中:<标记 style="样式的属性名1:样式的属性值1:属性名2:属性值2:.... ...