前言

1 – 在性能优化前,我们就要了解 iOS的工作原理,侧重点就是屏幕成像问题

2 – CPU(Central Processing Unit)和 GPU(Graphics Processsing Unit)在屏幕成像的过程中起着至关重要的作用

① 中央处理器 CPU:对象的创建和销毁、对象的属性调整、布局计算、文本计算和排版、图像绘制、图片格式的转换和解码等等

② 图形处理器 GPU:纹理渲染

CPU就是把一切将要展示的数据完成计算后交给 GPU进行渲染、展示。iOS采用的是双缓存机制,有前帧缓存、后帧缓存

3 – 屏幕成像原理

注:掉帧是屏幕卡顿的最主要原因之一。解决卡顿的主要思路就是尽可能地减少 CPU、GPU的资源消耗。iOS设备 60FPS的刷帧率完全可以保证屏幕的流畅性(每 16ms = 1000/60 就会有一次垂直同步信号)

4 – 渲染方式:在 OpenGL中 GPU有两种渲染方式

① On-Screen Rendering 当前屏幕渲染:在当前用于显示的屏幕缓冲区进行渲染操作

② Off-Screen Rendering 离屏渲染:在当前用于显示的屏幕缓冲区以外新开辟一个缓冲区进行渲染

5 – 离屏渲染耗性能的原因

① 它需要创建一个新的缓冲区

② 离屏渲染过程是需要多次切换上下文环境:显示从当前屏幕切换到离屏,等到离屏渲染结束后,将离屏渲染缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕

6 – 哪些操作会触发离屏渲染

① 光栅化:layer.shouldRasterize = YES

② 遮罩:layer.mask

③ 圆角:同时满足 layer.masksToBounds = YES、layer.cornerRadius大于 0两个条件触发离屏渲染。所以当涉及圆角时可以考虑使用 CoreGraphics绘制或让美工提供圆角图片

④ 阴影:layer.shadowXXX。但是如果设置了 layer.shadowPath就不会产生离屏渲染

优化方向

1 – CPU 方面 

① 尽量使用轻量级对象。比如数字,能用基本类型的就不要使用 NSNumber;又比如用不到事件处理的地方,使用 CALayer取代 UIView

② 不要频繁地调用 UIView相关属性。比如 frame、bounds、transform等,尽量减少不必要的修改

③ 提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性

④ Autolayout会比直接设置 frame消耗更多的系统资源,适当减少自动布局

⑤ 配置图片尺寸尽量同 UIImageView的尺寸保持一致

⑥ 注意控制线程的(最大)并发量

⑦ 把耗时的操作放到子线程。比如文本处理(尺寸计算、绘制);图片处理(下载、解码、绘制)

2- GPU方面

① 尽量减少视图数量和层次

② 尽量避免短时间内大量图片的显示

③ 尽可能将多张图片合成一张进行展示

④ 尽量减少透明视图的使用 alpha < 1。透明就是透明,不透明就是不透明

⑤ 尽量避免离屏渲染

卡顿检测

1 – 平常所说的卡顿主要是因为在主线程执行了比较耗时的操作。我们可以添加 Observer到主线程的 RunLoop中,通过监听 RunLoop状态切换时的耗时以达到监控卡顿的目的

 

版权声明:本文为CodingLife ✎ 原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/self-epoch/p/16285446.html