Instrument使用总结
Instruments简介
Instruments是一个强大而灵活的性能分析和测试工具,它是Xcode工具集的一部分。 它旨在帮助您分析OS X和iOS应用程序,进程和设备,以更好地理解和优化其行为和性能。 将Instruments从应用程序开发流程开始纳入您的工作流程,可以帮助您在开发周期的早期发现问题,从而为您节省时间。
有效的使用Instruments,你可以:
- 检查一个或多个应用程序或进程的行为
- 检查设备特定的功能,如Wi-Fi和蓝牙
- 在模拟器或物理设备上执行分析
- 创建自定义DTrace instruments来分析系统和应用行为的各个方面
- 追踪源代码中的问题
- 对您的应用进行性能分析
- 在您的应用程序中查找内存问题,例如leaks(没有释放,内存泄漏), abandoned memory(分配内存,未使用), and zombies(引用释放的对象)
- 找出优化您的应用的方法提高效率
- 进行一般的系统级故障诊断
- 保存Instruments配置模板
Blank
打开一个空白模板,可以任意添加其他模板分析工具
Activity Monitor
该模板监视指定的一个或多个进程的总体CPU,内存,磁盘和网络使用情况统计信息。该模板可以与OS X或iOS一起使用。
Allocations
捕获有关应用程序内存分配的信息。它仅记录来自单个进程的信息。
Core Animation
捕获有关所选动画统计信息。它可以记录单个进程或系统上运行的所有进程的信息。
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就不用耗费资源计算,直接显示绿色。
如果出现图层混合了,打开Color Blended Layers选项,那块区域会显示红色,所以我们调试的目的就是将红色区域消减的越少越好。那么如何减少红色区域的出现呢?只要设置控件不透明即可。
(1)设置opaque 属性为NO。
(2)给View设置一个不透明的颜色,没有特殊需要设置白色即可。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眉眉了~Color Non-Standard Surface Formats (不标准的表面颜色格式)
?Color Immediately(颜色刷新频率)
当执行颜色刷新的时候移除10ms的延迟,因为可能在特定情况下你不需要这些延迟,所以使用此选项加快颜色刷新的频率。Color Misaligned Images(图片大小)
这个选项可以帮助我们查看图片大小是否正确显示。如果image size和imageView size不匹配,image会出现黄色。要尽可能的减少黄色的出现,因为image size与imageView size不匹配,会消耗资源压缩图片。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
为了尽可能避免触发离屏渲染,我们可以换其他手段来实现必要的功能:
1)阴影绘制shadow:使用ShadowPath来替代shadowOffset等属性的设置
imageViewLayer.shadowPath = CGPathCreateWithRect(imageRect, NULL);
(2)利用CoreGraphics生成一张带圆角的图片或者view。Color Compositing Fast-Path Blue (快速路径)
Places a blue overlay over content that is detached from the compositor.标记由硬件绘制的路径为蓝色,蓝色越多越好Flash Updated Regions (重绘区域)
Colors regions on your iOS device in yellow when those regions are updated by the graphics processor.这个选项会对重绘的内容高亮成黄色,重绘就是指使用Core Graphics绘制,绘制会损耗一定的性能,因此重绘区域应该越小越好。
Energy Log
提供有关能源使用的诊断信息以及主要设备组件的基本开/关状态
Leaks
捕获泄漏内存的信息,它只能记录来自单个进程的信息。
Metal System
通过提供来自应用程序,驱动程序和GPU图层的跟踪信息来描述iOS金属应用程序的性能。
Network
分析应用程序使用的TCP / IP和UDP / IP连接
System Trace
提供有关系统行为的全面信息。它显示了线程调度的时间,并通过系统调用和内存操作显示了从用户到系统代码的线程转换。
System Usage
监视应用程序套接字和共享内存相关的系统I / O活动并记录文件
Time Profiler
Time Profiler帮助我们分析代码的执行时间,找出导致程序变慢的原因
Zombies
测量一般的内存使用情况,同时重点检测过度释放的“僵尸”对象。 还提供了按类别分配对象的统计信息以及所有活动分配的内存地址历史记录