屏幕撕裂
iOS设备保证画面流畅性需要尽量保持在60fps,即每秒需要更新60帧的画面,那么一帧画面就需要GPU和CPU在16.7ms内准备好要显示的数据。
当CPU+GPU处理时间超过16.7ms,由于垂直同步信号VSnyc的作用加在两帧中间,显示器不会去渲染只准备了一半的数据,不然会造成屏幕撕裂现象,因此屏幕中仍显示的是当前帧的数据,造成卡顿的现象。
苹果为了优化卡顿使用了垂直同步Vsync + 双缓冲区
-
垂直同步Vsync信号:垂直同步信号类似于给帧缓冲区(显存)加同步锁。Vsync主要是为了防止屏幕撕裂现象。
-
双缓冲区:为了解决撕裂现象,提出双缓冲区的解决方法。即准备两个缓冲区,将准备好的渲染数据依次交替放入两个缓冲区中。
掉帧
垂直同步Vsync信号+ 双缓冲区,解决了屏幕撕裂的问题。但是有会出现新的问题,由于一帧的计算时间超过16.7ms,则显示器不会渲染缓冲区中未准备好的渲染数据,仍保留当前的帧数据,从而造成掉帧现象。
因此又提出了三缓存区的方案。cpu和GPU闲置时间准备渲染数据
im1.png
- CPU:运算/控制核心(负责的运算),文本的布局、UI计算、图片解码、图像的绘制(Core Graphics)等。
- GPU:绘图运算的微处理器,纹理的渲染,适合做高并发运算、依赖度比较低的运算。
屏幕卡顿的原因
- CPU/GPU 渲染流水线耗时过长,掉帧
- 垂直同步VSync + 双缓冲区,以掉帧作为代价解决屏幕撕裂
- 三缓冲区:合理使用CPU/GPU减少掉帧次数
iOS中滑动优化方案
- CPU
- 对象创建、调整、销毁
- 预排班(布局计算、文本计算)
- 预渲染(文本等异步绘制,图片编解码等)
可以将这些操作放在子线程中。
- GPU
减少离屏渲染。
视图混合:减少图层数。视图层级层层叠加,需要对每个图层的像素点进行大量计算
网友评论