iOS开发者进阶程序员视图卡顿、掉帧和绘制原理

iOS探索:UI视图之卡顿、掉帧及绘制原理

2018-12-06  本文已影响134人  熊猫超人biubiubiu

在开始理解卡顿、掉帧及绘制原理前,首先让我们先了解下图像的显示原理

图像显示原理

WX20181206-150708@2x.png

那么接下来让我们看一下CPU和GPU分别做了哪些事情

WX20181206-153514@2x.png

那么CPU和GPU具体做了哪些工作承担呢

CPU

具体分为四个阶段

GPU渲染管线

UI卡顿、掉帧的原因

WX20181206-160621@2x.png

在显示器中是固定的频率,比如iOS中是每秒60帧(60FPS),即每帧16.7ms

从上图中可以看出,每两个VSync信号之间有时间间隔(16.7ms),在这个时间内,CPU主线程计算布局,解码图片,创建视图,绘制文本,计算完成后将内容交给GPU,GPU变换,合成,渲染(详细可学习 OpenGL相关课程),放入帧缓冲区

假如16.7ms内,CPU和GPU没有来得及生产出一帧缓冲,那么这一帧会被丢弃,显示器就会保持不变,继续显示上一帧内容,这就将导致导致画面卡顿

所以无论CPU,GPU,哪个消耗时间过长,都会导致在16.7ms内无法生成一帧缓存

卡顿、掉帧优化方案切入点

UIView的绘制原理

流程图
QQ20181206-211905@2x.png

上面就是UIView的绘制原理,接下来我们看一下系统绘制流程是怎样的

老规矩,先上流程图
QQ20181206-213639@2x.png

那么问题来了,我们如何进行异步绘制呢

实际上我们就需要借用系统给开的这个口子,即[layer.delegate displayLayer:]

国际惯例,流程图走一波(原谅我画图能力实在有限TT)

QQ20181206-220620@2x.png

离屏渲染 (便于理解视图卡顿、掉帧中对GPU的开销)

离屏渲染指的是GPU在当前屏幕缓冲区以外开辟了一个缓冲区进行渲染操作

当前屏幕渲染不需要额外创建新的缓存,也不需要开启新的上下文,相对于离屏渲染性能更好。但是受当前屏幕渲染的局限因素限制(只有自身上下文、屏幕缓存有限等),当前屏幕渲染有些情况下的渲染解决不了的,就使用到离屏渲染

离屏渲染对性能的的代价是很高的,主要体现在:

导致产生离屏渲染的原因:

上一篇 下一篇

猜你喜欢

热点阅读