前言

iOS中图形图画的烘托流程,在平常开发中最常运用的开发结构是UIKit,咱们会运用UIKit的结构来制作界面,而UIKit实际能够看成是集成CoreAnimationCoreGraphics这两个结构,来方便开发者运用,设置UIKit的一些布局和相关特点来制作界面。

离屏渲染(一)

  • 假如界面假如需求动画作用就需求CoreAnimation这个结构来实现,而CoreAnimation又依赖于OpenGL ES/Metal 来做GPU的烘托。
  • CoreGraphics结构是一个高级的绘图引擎,它的首要作用是运转的时分去制作图画。咱们能够运用这个结构来做一些绘图、转换、离屏烘托、阴影、图画的创立等等。
  • CoreGraphics是在CPU是履行的 ,CoreImageCoreGraphics是相反的,CoreImage是处理创立图画运转前的操作,CoreImage拥有一套现成的图画过滤性,它能对一些已经存在的图画进行高效的处理,这个结构既能在CPU上履行,也能在GPU上履行,咱们APP就会运用CoreGraphicsCoreAnimationCoreImage来制作一些可视化的内容,这些结构都需求再经过OpenGL ES/Metal来做GPU的制作,终究再将图画显现到屏幕上面。

一、图画图画烘托流程

离屏渲染(一)

上面这张图画就告诉咱们图形图画在烘托的时分CPUGPU别离做了哪些工作:

  • 首要,在Application阶段,是由CPU来处理,CPU会创立咱们的视图,它会核算视图的一些数据,进行编解码,制作纹理等等的操作后再交给GPUGPU在第一阶段会经过顶点着色器去确认图画在硬件上具体的显现方位;
  • 然后,经过片源着色器来核算每个像素点的色彩值,最后进行光栅化,这个光栅化会找到图形上像素的点的规模,然后把一个一个的像素点的色彩显现上去,终究会把图形转化为一个个的实际的屏幕像素,当这些操作都处理完之后,就会把烘托完成之后的数据放到帧缓存区里边;
  • 最后,再交由显现体系将帧缓存区里的数据给读取出来进行显现 。

二、图画显现流程图

离屏渲染(一)

上面便是图画显现流程图,当一个图画在CPUGPU处理完之后,它就会被存放到FrameBuffer里边,FrameBuffer被称为帧缓存区,然后视频控制器就会往FrameBuffer去读取数据,读取的数据就会交给显现器显现,咱们就能看到屏幕上一帧一帧的画面。

三、屏幕扫描

离屏渲染(一)

它是经过屏幕扫描的方法,会经过CRT电子枪从上到下逐行扫描,这个扫描的进程便是读取帧缓存区里的数据,当它扫描完的时分,它就会显现一帧的画面, 当显现完一帧画面后,CRT电子枪又回到原来的方位继续从上到下扫描,这样就会显现下一帧的画面,如此循环往复,这便是咱们能看到手机屏幕上的一些内容。

当电子枪扫描完一行要换到下面一行的时分,这个时分显现器会发出水平同步信号HSync;当电子扫描完一帧,要回到原来方位,这个时分显现器就会发出垂直同步信号VSync。这个显现器一般都是依照固定的频率来改写的,这个改写的频率便是垂直同步信号VSync的频率。苹果手机(除了新出的高刷)的改写频率是每秒60次,也便是60FPS,这便是咱们在进行屏幕卡顿监测或许卡顿优化的时分,会用FPS来作为衡量的指标。

离屏渲染(一)

假如屏幕改写频率不是接近固定改写频率,那便是出现了掉帧。当一个垂直同步信号过来的时分,假如说CPUGPU还没有完成烘托的成果去做提交,也便是没有把数据放到FrameBuffer里边,这种状况,未过来提交过来这一帧的画面就会被丢弃,然后等待下一次垂直同步信号过来,再来显现新的画面,这个进程被称为掉帧。 掉帧的时分,屏幕改写的FPS频率就会削减,这也是界面显现真正卡顿的原因。

接下来是或许造成屏幕卡顿的离屏烘托.

四、离屏烘托

离屏渲染(一)

比方咱们给图画添加了遮罩,设置了某些圆角,CPUGPU没有办法把烘托的数据放到FrameBuffer上,它会把烘托的数据先放到FrameBuffer之外的一块缓冲区,在这块区域进行组成烘托,烘托到咱们终究想要的画面,再把数据放到FrameBuffer里边,这个进程便是离屏烘托

离屏渲染(一)

先看UIViewCALayer的关系,UIView是基于CALayer的封装,一个View他本身是不能显现的,它想要显现,需求经过内部图层的CALayer来显现,UIViewCALayer的只读特点和遵从CALayer的代理。当View显现什么内容,都要制作在它内部图层Layer上面,这个Layer便是担任显现,而View担任处理响应的事情。因此,咱们看到的界面是View里边的layer层所出现出来的。

离屏渲染(一)

下图能够看出,layer首要包含三个部分backgroundColorcontentsborderColor

离屏渲染(一)

  • 当视图层级比较复杂的时分,GPU无法直接把烘托数据放到FrameBuffer。比方下面的图例,第三张图是咱们终究要看到的画面,它比较复杂,因为CPUGPU是硬件,它有功能瓶颈,它去读取画面数据需求必定的算法,这个时分因为GPU没有办法经过一次遍历就能拿到一帧的完好数据,这个时分它就会遵从画家算法。
  • 要画下面这张图,GPU它是一个机器,它就一块画布,第一次遍历扫描到图片上的山,这样第一次遍历完毕后第二次遍历开始的时分,需求一块新的画布,又扫描出了草地, 以此类推,第三次遍历在新的画布上加上了树。
  • 但是,无论是树仍是草地或许树都不是咱们终究想要的画面作用,这样就不能把任一画布单独放进FrameBuffer里边,因为画面不够完好,这样就需求开启一块额定的内存缓冲区,然后山、草地和树就在这里边组成,组成终究的作用再把组成的数据存到帧缓存区,这便是离屏烘托的整个流程。

离屏渲染(一)

离屏烘托便是硬件的瓶颈,有的图形,它没有办法做到一次烘托完成,于是经过离屏烘托的方法来处理,这便是离屏烘托产生的原因。