参考资料:
离屏渲染优化详解:实例示范+性能测试
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会闲置,当通道达到一定数量的时候,对性能也会有较大的影响。
触发离屏渲染的几个行为:
- drawRect:方法
- layer.shadow 可以用layer.shadowPath指定阴影路径的方式替代
- layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
- layer.shouldRasterize 光栅化,
- layer.mask
- 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下也有几个常用的检测项,方便在模拟器上随时查看。