iOS笔记 - APP性能优化 01:屏幕卡顿
前言
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状态切换时的耗时以达到监控卡顿的目的