• Core Animation图形性能
  • Debug Options
    • 1Color Blended Layers 图层混合
    • 2 Color Hits Green and Misses Red 图层缓存
    • 3Color Copied Images 图片格式检测
    • 4Color Misaligned Images 图片尺寸是否匹配
    • 5Color Offscreen-Rendered Yellow 圆角图层蒙版阴影重绘
    • 6Color Compositing Fast-Path Blue 快速路径
    • 7Flash updated Regions 重绘区域
    • 8Color Immediately颜色刷新频率
    • 9Color No-Standard Surface Formats

1. Core Animation(图形性能)

Core Animation: 离屏渲染,图层混合等GPU耗时。
英文描述: this template measures application graphics performace as well as cpu usage of a process via time profiling

该模块对通过时间来分析APP的图形性能处理情况,同time profiling分析一个进程的CPU使用情况类似

CoreAnimation系要注意的一点是必须是真机调试,用于调试离屏渲染,绘图,动画,等操作。

2. Debug Options

1、Color Blended Layers 图层混合

首先我们要明白像素的概念,屏幕上每一个点都是一个像素,像素有R、G、B三种颜色构成(有时候还带有alpha值)。如果某一块区域上覆盖了多个layer,最后的显示效果受到这些layer的共同影响。举个例子,上层是蓝色(RGB=0,0,1),透明度为50%,下层是红色(RGB=1,0,0)。那么最终的显示效果是紫色(RGB=0.5,0,0.5)。这种颜色的混合(blending)需要消耗一定的GPU资源,因为实际上可能不止只有两层。如果只想显示最上层的蓝色,可以把它的透明度设置为100%,这样GPU会忽略下面所有的layer,从而节约了很多不必要的运算。<

//

这个选项基于渲染程度对屏幕中的混合区域进行绿到红的高亮(也就是多个半透明图层的叠加)。由于重绘的原因,混合对GPU性能会有影响,同时也是滑动或者动画帧率下降的罪魁祸首之一。

GPU每一帧可以绘制的像素有一个最大限制(就是所谓的fill rate),这个情况下可以轻易地绘制整个屏幕的所有像素。但是如果由于重叠图层的关系需要不停地重绘同一区域的话,掉帧就可能发生了。

GPU会放弃绘制那些完全被其他图层遮挡的像素,但是要计算出一个图层是否被遮挡也是相当复杂并且会消耗处理器资源。同样,合并不同图层的透明重叠像素(即混合)消耗的资源也是相当客观的。所以为了加速处理进程,不到必须时刻不要使用透明图层。任何情况下,你应该这样做:

给视图的backgroundColor属性设置一个固定的,不透明的颜色
设置opaque属性为YES
如果用到了图像,尽量避免透明除非非常必要。如果图像要显示在一个固定的背景颜色或是固定的背景图之前,你没必要相对前景移动,你只需要预填充背景图片就可以避免运行时混色了。
如果是文本的话,一个白色背景的UILabel(或者其他颜色)会比透明背景要更高效。

Color Blended Layers”正是用于检测哪里发生了图层混合,并用红色标记出来。因此我们需要尽可能减少看到的红色区域。一旦发现应该想法设法消除它。开始调试后勾选这个选项,我们在手机上可以看到如下的场景:

2. Color Hits Green and Misses Red : 图层缓存

光栅化是将一个layer预先渲染成位图(bitmap),然后加入缓存中。如果对于阴影效果这样比较消耗资源的静态内容进行缓存,可以得到一定幅度的性能提升。demo中的这一行代码表示将label的layer光栅化:
label.layer.shouldRasterize = YES;

它表示如果命中缓存则显示为绿色,否则显示为红色,显然绿色越多越好,红色越少越好。

注意:光栅化的核心在于缓存的思想。

这是因为layer进行光栅化后渲染成位图放在缓存中。当屏幕出现滑动时,我们直接从缓存中读取而不必渲染,所以会看到绿色。当新的label出现时,缓存中没有个这个label的位图,所以会变成红色。第三点比较关键,缓存中的对象有效期只有100ms,即如果在0.1s内没有被使用就会自动从缓存中清理出去。这就是为什么停留一会儿再滑动就会看到红色。

当我们使用得当时,光栅化可以提供很大的性能优势,但是一定要避免作用在内容不断变动的图层上,否则它缓存方面的好处就会消失,而且会让性能变的更糟。

3、Color Copied Images 图片格式检测

颜色格式: 像素在内存中的布局和它在磁盘中的存储方式并不相同。考虑一种简单的情况:每个像素有R、G、B和alpha四个值,每个值占用1字节,因此每个像素占用4字节的内存空间。一张1920*1080的照片(iPhone6 Plus的分辨率)一共有2,073,600个像素,因此占用了超过8Mb的内存。但是一张同样分辨率的PNG格式或JPEG格式的图片一般情况下不会有这么大。这是因为JPEG将像素数据进行了一种非常复杂且可逆的转化。

CPU主要处理两件事:
(1)把图片从PNG或JPEG等格式中解压出来,得到像素数据
(2)如果GPU不支持这种颜色各式,CPU需要进行格式转换
比如应用中有一些从网络下载的图片,而GPU恰好不支持这个格式,这就需要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)。

4、Color Misaligned Images 图片尺寸是否匹配

在项目中,我们网络请求图片,大小不一,但是展示的UIImageView有时候是固定大小。这时候我们就需要图片的缩放了。图片的缩放需要占用时间,因此我们要尽可能保证无论是本地图片还是从网络或取得图片的大小,都与其frame保持一致。

如果图片需要缩放则标记为黄色,如果没有像素对齐则标记为紫色。勾选上这个选项并进行调试,可以看到如下场景:

5、Color Offscreen-Rendered Yellow: 圆角,图层蒙版,阴影,重绘

离屏渲染表示渲染发生在屏幕之外。离屏渲染意味着把渲染结果临时保存,等用到时再取出,因此相对于普通渲染更占用资源。

选项“Color Offscreen-Rendered Yellow”会把需要离屏渲染的地方标记为黄色,大部分情况下我们需要尽可能避免黄色的出现。离屏渲染可能会自动触发,也可以手动触发。以下情况可能会导致触发离屏渲染:

1、重写drawRect方法;(自动触发离屏渲染)
2、有mask或者是阴影(layer.masksToBounds, layer.shadow*),模糊效果也是一种mask;(自动触发离屏渲染)
3、layer.shouldRasterize = true;(手动开启离屏渲染)

设置cornerRadius本身并不会导致离屏渲染,但很多时候它还需要配合layer.masksToBounds = true使用。根据之前的总结,设置masksToBounds会导致离屏渲染。解决方案是尽可能在滑动时避免设置圆角,如果必须设置圆角,可以使用光栅化技术将圆角缓存起来:

(1)drawRect:方法
(2)layer.shadow
(3)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
(4)layer.shouldRasterize
(5)layer.mask
(6)layer.masksToBounds && layer.cornerRadius

6、Color Compositing Fast-Path Blue 快速路径

离屏渲染的最后一步是把此前的多个路径组合起来。如果这个组合过程能由CPU完成,就会大量减少GPU的工作。这种技术在绘制地图中可能用到。

标记由硬件绘制的路径为蓝色,蓝色越多越好,可以对直接使用OpenGL绘制的图层进行高亮。没有对OpenGL有过多的研究,所以这里没办法给出demo,大家只需要记住蓝色越多越好就ok。

这个选项会对任何直接使用OpenGL绘制的图层进行高亮。如果仅仅使用UIKit或者Core Animation的API,那么不会有任何效果。如果使用GLKView或者CAEAGLLayer,那如果不显示蓝色块的话就意味着你正在强制CPU渲染额外的纹理,而不是绘制到屏幕。

7、Flash updated Regions : 重绘区域

这个选项会对重绘的内容高亮成黄色,重绘就是指使用Core Graphics绘制,绘制会损耗一定的性能,因此重绘区域应该越小越好。

8、Color Immediately(颜色刷新频率)

当执行颜色刷新的时候移除10ms的延迟,因为可能在特定情况下你不需要这些延迟,所以使用此选项加快颜色刷新的频率。不过一般这个调试选项我们是用不到的。

9、Color No-Standard Surface Formats

就是打开这个选项,某些Label和Button的背景颜色都会出现银白色,但是不是必先现的,有些Label和Button依然正常颜色背景。其他ImageView等控件是不会出现银白色的背景颜色。

iOS Instrument使用之Core Animation(图形性能)相关推荐

  1. iOS开发:Core Animation编程指南

    关于Core Animation Core Animation是iOS与OS X平台上负责图形渲染与动画的基础设施.Core Animation可以动画视图和其他的可视元素.Core Animatio ...

  2. Core Animation学习总结

    目录: The Layer Beneath The Layer Tree(图层树) The Backing Image(寄宿层) Layer Geometry(图层几何学) Visual Effect ...

  3. 绘图、Core Animation与硬件架构

    原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wan ...

  4. iOS Core Animation Advanced Techniques(七):高效绘图、图像IO以及图层性能

    高效绘图 不必要的效率考虑往往是性能问题的万恶之源. --William Allan Wulf 在第12章『速度的曲率』我们学习如何用Instruments来诊断Core Animation性能问题. ...

  5. iOS 图形性能进阶与测试

    Core Animation Pipeline 第一部分主要讲解了Core Animation的工作流程和渲染过程. CoreAnimation的渲染流程可以用下图来概括: 在GPU的渲染过程中,我们 ...

  6. iOS——Core Animation 知识摘抄(二)

    阴影 主要是shadowOpacity .shadowColor.shadowOffset和shadowRadius四个属性 shadowPath属性 我们已经知道图层阴影并不总是方的,而是从图层内容 ...

  7. iOS Core Animation 简明系列教程

    iOS Core Animation 简明系列教程 看到无数的CA教程,都非常的难懂,各种事务各种图层关系看的人头大.自己就想用通俗的语言翻译给大家听,尽可能准确表达,如果哪里有问题,请您指出我会尽快 ...

  8. ios开发——使用CALayer和Core Animation做动画效果

    一. CALayer (一). CALayer简介 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView,其实UIV ...

  9. IOS Core Animation Advanced Techniques的学习笔记(五)

    第六章:Specialized Layers   类别 用途 CAEmitterLayer 用于实现基于Core Animation粒子发射系统.发射器层对象控制粒子的生成和起源 CAGradient ...

最新文章

  1. 《系统集成项目管理工程师》必背100个知识点-58沟通方式
  2. Android使用开源项目Xutils实现多线程下载文件
  3. php selected,php-多个选择字段-多次使用selected =“ selected”
  4. 数据分析的流程是啥样?
  5. Git笔记(22) 项目贡献要点
  6. 闪光灯slave是什么意思_闪光灯实战讲解 | 室内光线+闪光灯使用配合=完美光效...
  7. 带你全面掌握高级知识点!深入理解java虚拟机pdf下载
  8. 我的大学生活-4-21-吕家尧
  9. excel两个表格数据合并
  10. MCU 配置 Cyclone FPGA
  11. HDU3665Seaside(最短路径)
  12. 高德离线地图vue-amap的api文档(1):创建地图,撒点等等
  13. python中反斜杠是什么意思_python中反斜杠是什么意思
  14. 解决 Windows系统 快捷方式 图标 变成 白色方块
  15. 【算法设计与分析】将数字分解为n个数字之和
  16. 201871010123-吴丽丽《面向对象程序设计(Java)》第四周学习总结
  17. Qt QComboBox下拉菜单背景透明
  18. neon浮点运算_ARM NEON指令集优化理论与实践
  19. 手机c语言图形界面编程工具,「分享」C语言如何编写图形界面
  20. Unity安装配置Android环境 SDK,JDK,JIR

热门文章

  1. 每日下载次数限制php,织梦实现会员限制用户单日下载软件资源的上限方法
  2. Android Framework 记录之一
  3. 心碎的图案怎么用c语言编出来,教案实验2用c语言编写简单程序.doc
  4. HDOJ 6078-Wavel Sequence
  5. HTML5菜鸟教程在线编译特效,菜鸟教程在线工具
  6. 你的个人所得税完税证明看准了吗?
  7. Springboot简便的配置微信小程序
  8. 阿里云centos7部署l2tp后无法连接
  9. 高级驾驶辅助系统各子系统一览
  10. HashMap 容量为2次幂的原因