1.显示原理
为了使显示不受系统总线带宽的限制,现在主流系统大多都是CPU与GPU分工明确,结构图如下,CPU负责处理逻辑与数据,GPU负责图像渲染与显示:
主流系统结构.png
CPU计算好将要显示的内容提交给GPU -> GPU进行渲染与处理提交到屏幕缓冲区(帧缓冲区) -> 显示控制器以一定频率将屏幕缓冲区的内容通过光栅扫描系统显示在屏幕上
图片撕裂原因
因为显示器一般是光栅扫描的,如图:
屏幕光栅扫描.png
而屏幕缓冲区的内容也是实时更新的,当屏幕进行下一次刷新时,屏幕缓冲区的内容还没有变化,当扫描到一半时,屏幕缓冲区的内容刷新,下一半的图像就行变成新屏幕缓冲区的内容,上半部分是旧内容,下半部分是新内容,所以造成图片撕裂
屏幕撕裂缓冲数据示意图.png
解决方法:
当内容渲染完整时,才会更新屏幕缓冲区的内容,这样保证屏幕每一次显示都是一次渲染的内容,但是每一次都会等待下一帧的内容,所以会出现卡顿和情况,俗称
双缓冲区是在屏幕光栅扫描的同时,将另一帧的内容放在一个新的缓冲区,下一次光栅扫描时,扫描新缓冲区的内容,旧缓冲区渲染下一帧的内容,循环交替
单缓冲区与双缓冲区.png
一般是两者结合,基本能解决掉帧的问题
2.离屏渲染产生
切圆角 模糊效果
我们先来看下面一段代码
离屏渲染代码.png
运行结果:
运行结果.png
我们可以看出,第一张与第三张发生了离屏渲染, 区别在与这个图形的复杂度,当多图层时,切圆角会发生离屏渲染.
正常渲染流程:
离屏渲染流程.png
离屏渲染流程:
正常渲染流程.png
离屏渲染过程其实就是组合图片的过程,我们都知道计算机在渲染图片的时候,只能每个图层逐步渲染,当对多图层时切圆角的过程是:把每一个图层拿出来,处理,放到离屏缓冲区里面,当所有的都处理完之后进行合成,再把处理后的数据放在屏幕缓冲区里面.如图示:
多图层离屏渲染过程.png
模糊效果是一样的原理,只不过是把切圆角的过程变成水平与垂直模糊
圆角解决方案:UI切一个遮罩层 利用贝塞尔曲线重画
打开光栅化
打开光栅化的目的是为了复用已经处理好的内容,比如一个效果, 我们频繁的使用,那么打开光栅化性能会有很大的提升,不用每次都去重新渲染,光栅化离屏渲染时间有限制,超过100ms不使用就会丢弃,还有大小限制,过超过2.5倍像素大小也会失效
组透明度
当透明度不为1的图层进行叠加时,要计算混合部分颜色,设置了组透明度为YES
(layer.allowsGroupOpacity/ layer.opacity)
投影 绘制文字 coreText等
综合来讲,就是多图层处理,为了得到一个处理后的数据,会将每个处理的图层放在离屏缓冲区里组合,再放到屏幕缓冲区里












网友评论