参考资料:
离屏渲染优化详解:实例示范+性能测试
Instruments性能优化-Core Animation
UIView的alpha、hidden和opaque属性之间的关系和区别
iOS CoreAnimation专题——技巧篇(一)CADisplayLink –同步屏幕刷新的神器

什么是FPS

FPS全程Frames Per Second, 表示屏幕每一秒钟刷新的次数,比方说帧率为60Hz 就表示屏幕每秒钟刷新60次。

流畅性的标准

FPS值的大小体现了页面的流畅程度高低,当低于45的时候卡顿会比较明显,用户会察觉到滑动卡顿。

检测应用流畅性的工具

使用Instruments可以监控实时滑动帧率

检测影响流畅性的几个因素

首先说明一点,下面的情况发生时是会对性能造成一定的影响,但具体影响有多大,是否需要改动是要依据Instruments对帧率结果来判断的。当检测到滑动帧率比较低的时候,可以通过下面的检测项来逐一判断是哪个影响了帧率。

Color Blended Layers 图层混合

出现图层的地方会被标记成红色。
由于重绘的原因,图层混合对GPU性能有影响。GPU每一帧的绘制像素有最大限制,如果发生了重叠像素就需要不停的重绘同一个区域,掉帧和卡顿就有可能发生。GPU会放弃绘制那些已经被其他图层遮挡的像素,但是如果要计算出一个图层是否被遮挡也是相当复杂并且消耗CPU资源,同样,合并不同图层的透明重叠元素消耗的资源也很大。所以,为了快速处理,尽量避免使用透明图层。

Color Hits Green and Misses Red 光栅化缓存图片检测

当使用光栅化缓存渲染结果的时候,如果图层是绿色,就表示这些缓存被复用,如果图层是红色就表示缓存没有被复用会重复创建,这时候就是会造成性能问题。

Color Copied Images 拷贝图片/图片颜色格式

Shows images that are copied by Core Animation in blue.手机的显示是基于像素的,所以当手机要显示一张图片的时候,系统会帮我们对图片进行转换。如果GPU不支持当前图片的颜色格式,那么就会将图片交给CPU预先进行格式转化,并且这张图片标记为蓝色。

Color Misaligned Images 图片大小

检测图片是否有收缩拉伸。当要显示的图片大小和imageView的大小不一致的时候,就会发生。这样比较消耗CPU资源。

Color Off-screen Rendered离屏渲染

OpenGL中,GPU的渲染有两种方式:On-Screen Rendering当前屏幕渲染,指的是GPU的渲染是在当前用于显示屏幕的缓冲区中进行的;相反的Off-Screen Rendering离屏渲染,指的就是GPU的渲染是在当前屏幕的缓冲区之外新开辟的一个缓冲区进行的。
离屏渲染会需要更多的渲染通道,而且不同的渲染通道之间切换需要耗费一定的时间,这个时间内GPU会闲置,当通道达到一定数量的时候,对性能也会有较大的影响。

触发离屏渲染的几个行为:

  1. drawRect:方法
  2. layer.shadow 可以用layer.shadowPath指定阴影路径的方式替代
  3. layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
  4. layer.shouldRasterize 光栅化,
  5. layer.mask
  6. layer.masksToBounds && layer.cornerRadius 这两个条件同时满足是才回出现离屏渲染 对于不同的控件将采用不同的方法进行处理: 1). 对于label类,可以通过CoreGraphics来画出一个圆角的label 2). 对于imageView,通过CoreGraphics对绘画出来的image进行裁边处理 如wanjia2B中的UIImageView+Extension

关于Debug options的迁移

从官方文档Xcode Release Notes中可以看出,Xcode9开始,已经将Instruments中Core Animation里面的Debug options移到了Xcode -> Debug > View Debugging > Rendering下。默认是灰色的无法勾选,只有程序在真机上运行起来了才能勾选。

Deprecation and Removal Warnings
The Core Animation instrument and template have been deprecated in Instruments. The functionality previously under "Debug Options" has moved to Xcode, under "Debug > View Debugging > Rendering". (22971414)
The OpenGL ES Analyzer Instrument is no longer supported. It has been replaced by the GPU Frame Debugger in Xcode and will be removed in a future version of Instruments. (35104029)

Xcode9之前:
Xcode9之后:

在Simulator的Debug下也有几个常用的检测项,方便在模拟器上随时查看。

Copyright © shuoliu.com 2018 all right reserved,powered by Gitbook该文件修订时间: 2018-09-03 03:46:41

results matching ""

    No results matching ""