面试

iOS图像显示原理、UI卡顿掉帧、异步绘制、离屏渲染

2020-05-20  本文已影响0人  Oh丶Really

1、CPU工作:

Layout :UI布局(frame、size)、文本计算

Display: 绘制(drawRact)

Prepare:图片编解码(UIImage等)

Commit: 位图提交

2、GPU渲染管线(OpenGL渲染管线)

顶点着色、图元装配、光栅化、片段着色、片段处理------->所有处理完成后,将像素点提交到帧缓冲区(FrameBuffer)。

一、UI卡顿、掉帧原因

1s有60帧画面

二、优化方案

CPU:

子线程异步操作: 

对象创建、销毁、调整;

预排版(布局计算、文本计算);

预渲染(文本等异步绘制、图片编解码等)

GPU:

避免纹理渲染(圆角、动画、蒙层等),可以异步绘制避免

避免视图混合(层级复杂等),可以异步绘制避免

三、异步绘制

.layer setNeedDisplay 方法调用后系统不会马上调用 [CALayer display],而是在当前 layer 打上一个脏标记,会等到当前 Loop 将要结束时再调用 display 方法执行

系统绘制流程:

异步绘制:

--- [layer.delegate  dispayer:]

· 代理负责生成对应的 bitmap

· 设置该 bitmap 作为 layer.contents 属性的值

流程:

四、离屏渲染

在屏渲染(On-Screen Rendering):

当前屏幕渲染,指GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行

离屏渲染(Off-Screen Rendering):

离屏渲染,指GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作(圆角属性、蒙层操作等)

何时触发:

· 圆角(当和 maskToBounds 一起使用时)

· 图层蒙版

· 阴影

· 光栅化

为何要避免:

· 创建新的渲染缓冲区,内存开销增加

· 上下文切换,因为多通道渲染管线的合成

· 增加GPU工作量,可能会导致CPU+GPU操作时间超出了一帧16.7s ,会导致卡顿、掉帧

上一篇下一篇

猜你喜欢

热点阅读