好的用户体验需要我们把细节做到位,画面掉帧会导致卡顿感,造成不好的印象。
一、屏幕画面显示的原理
1.屏幕内容的显示是由一帧一帧的画面组成的,一秒是要显示60帧的画面的。
iOS 屏幕成像是当显示器发出垂直同步信号(VSync)时,系统就会从帧缓存中取出一帧交给视频控制器,根据水平同步信号(HSync)一行一行显示到屏幕中
- 一帧的画面又是按照什么方式绘制的呢?
由CPU
计算后交给GPU
渲染,渲染完成后放在帧缓存
中, 系统将帧缓存
读取到视屏控制器
然后显示到屏幕
.
CPU具体负责的事情有:
对象的创建与销毁、布局计算和排版、图片的格式转换和解码、图像的绘制
GPU负责的事情:纹理的渲染
二、会造成卡顿的原因分析
由上可知,在一个垂直同步信号
来临之前,CPU需要计算完并交给GPU渲染完成放到帧缓存
中,否则在垂直同步信号
到来时,从帧缓存
读取到的将是上一帧的内容,这种情况即“掉帧”, 掉帧越多卡顿越明显.
三、卡顿优化思路
尽量减少CPU、GPU的耗时。
针对CPU具体有:
- 避免频繁修改UIView的相关属性如:frame、bounds、transform。
- 尽量提前计算好布局并保存,在需要调整时直接赋值。
- AutoLayout比设置frame更加消耗CPU。
- 图片的size跟imageview的size保持一致。
- 把耗时的操作放到子线程。如:文本处理(尺寸计算、绘制)、图片处理(解码(先将图片绘制到上下文中生成后再返回一张UIImage,不这样做的话默认是在主线程完成解码)、绘制)。
针对GPU的具体有:
- 减少视图数量和层次。
- 大量图片的显示尽量将多个小图合并成一张大图来显示。
- 不要超过GPU能处理的最大纹理尺寸4096x4096,不然会占用到CPU资源.
- 减少透明的视图。
- 尽量避免离屏渲染。
离屏渲染
离屏渲染
指的是在当前屏幕缓冲区以外新建一个缓冲区来进行渲染,在当前屏幕缓冲区不够用的时候就会产生离屏渲染
.
离屏渲染会消耗性能是因为:需要生成新缓冲区,在离屏渲染的过程需要多次切换上下文环境。
会产生离屏渲染的操作: