ios.离屏渲染学习笔记
一 cpu gpu
1.cpu是处理数据逻辑和解码
2.Gpu负责渲染 ,首先通过顶点着色器确定图片显示的位置,我们的平移旋转缩放就是在这个阶段处理。(这个就是取图像的顶点)
3.几何着色器,将产生的点变成几何图形
3.确定位置和形状后再通过光栅化转化成屏幕像素,再通过片段着色器往像素格里面填充颜色,光栅扫描和填色过程类似打印机这样.
总结:前面三步总结一下就是类似画画,cpu是将数据逻辑处理完毕交给GPU,gpu通过顶点着色器确定显示位置,通过几何着色器确实形状,通过光栅扫描转成像素格,在通过片段着色器给像素格上色.
4.上色完后不会立即显示在屏幕上,会放入帧缓存区里,这里会涉及到一个问题就是屏幕撕裂,如果我们只有一个帧缓存,当屏幕渲染到一半的时候,也就是光栅扫描到一半的时候,cpu需要处理渲染的数据更新了,可以理解为打印机打印到一半的时候,你要打印的图片换了,那么你剩下的半张纸打印的就是更新后的数据的后半部分,就会造成屏幕撕裂.
苹果怎么处理屏幕撕裂呢,通过垂直同步信号和双缓存策略来解决屏幕撕裂
垂直同步信号是确定一帧图像能够完整的着色完绘制完毕,当一帧图片从头绘制到尾的时候才会发出这个信号,双缓存可以理解为2个人一起做渲染工作,以前是单帧处理,现在又开了一条线处理图像,保证每一帧都能够有单独的渲染缓存区,如果下一帧缓存结束后,屏幕的指针又会指向下一帧缓存区,而下下帧图像又会进入空出来的帧缓存里处理,就这样循环交换处理.
5.掉帧问题
AB缓存区是双缓存,当前屏幕显示的是A缓存区,但是这个帧调换是是有个时间轴间隔的vsync,类似Runloop,如果时间到了,b缓存区还没有缓存完毕,那么屏幕就会继续显示A缓存区内容,继续显示这个过程就叫掉帧.解决可以用三缓冲区可以减少掉帧.但不能完全不掉帧,不过苹果还是选择用的双缓冲机制
6.出现掉帧卡顿问题的原因:
1.gpu渲染的时候耗时过长,所以为啥苹果建议显示图层的时候不要有过多级别,图层数不要过于复杂.
7.离屏渲染的出现的原因 (多图层组合,需要做中间的缓存)
1.图层合并的时候会离屏渲染 (会开辟新的缓存区 然后将缓存结果合并放在帧缓存区,就是所谓的上下文的切花,这些动作也是耗时操作)
总结:苹果没法一次得到结果的时候,就会分开操作,开辟额外的额缓存区,然后进行合并,这额外的缓存区就是离屏缓存,比如圆角和遮罩还有模糊效果
2.光栅化离屏渲染
3.圆角为啥会离屏渲染
因为有三个图层,设置圆角的话会对三个图片都进行裁剪然后合并,这样就会先把三个图层放到离屏缓存区去然后逐一进行裁剪合并. 为什么不把三个图层放一起裁剪呢,那是我们生活中才能实现的额,计算机不行. backgroundcolor是一个图层, contents内容是一个图层,边框是一个图层
一个控件如果加了背景色算一个图层,button默认有颜色 uiimageview是没有背景色,没有背景色加图片就只算一个图层
总节一下:cpu处理完数据,gpu的顶点着色器确定显示位置,形状着色器确定形状,光栅扫描将形状范围转化成像素,片元着色器上色,当进帧缓存区
垂直同步和双缓存机制解决屏幕撕裂
掉帧是因为渲染时间长,三缓存解决
离屏渲染是因为多图层组合
注意:背景颜色算一层 ,s9过后imagview切圆角不会离屏渲染