UI图像显示原理知识主要是为了UI卡顿掉帧原因相关问题做一个铺垫和基础的准备。
-
关于图像的显示原理
CPU和GPU两个硬件都是通过总线连接起来的,那么在CPU当中所输出的结果往往是一个位图,再经由总线在合适的时机传递给GPU,GPU拿到这个位图之后会做响应位图的图层渲染,包括纹理合成,之后会把结果放到帧缓冲区域当中,由视频控制器根据vsync信号在指定时间之前,去提取对应帧缓冲区当中的屏幕显示内容,然后最终显示到我们的手机屏幕上。
看一下CPU和GPU在这个过程中分别作了哪些事:
首先,当创建一个UIView空间之后,它的显示部分是由CALayer负责的,那么CALayer当中有一个contents属性,就是最终要绘制到屏幕上面的位图,比如创建的是一个label,那么contents里面最终放置的就是关于HelloWorld文字的位图。系统会在合适的时机回调一个drawRect:方法,然后可以在此基础之上去绘制一些自己想要自定义绘制的内容。绘制好的位图最终会经由CoreAnimation框架提交给 OpenGL(ES)渲染软件,最终进行位图的渲染包括纹理的合成 ,然后会显示到屏幕上面,这就是UI视图显示到屏幕上的一个大致的过程。在虚线左侧这部分都是发生在CPU上面的,而右侧这部分(OpenGL)是发生在GPU上面的。
-
接下来看一下CPU和GPU在具体承担哪些工作:
首先对于CPU来说,它首先要完成UI的布局包括显示(绘制),之后会做一些准备工作,然后把对应的位图提交到GPU上面,对于布局这方面,实际上就是关于UI布局以及文本计算,对应到平时的代码上实际上就是对应每个控件的frame设置,包括对于一些label文字size的计算。display过程实际上是绘制的过程,比如drawRect:方法就发生在这一步骤当中。那么在准备阶段,比如说使用到了UIImageView,那么设置他的image的时候,这个图片往往是不能直接显示到屏幕上去的,需要对图片进行解码,而这个解码的动作就发生在这一过程当中,最后再由CoreAnimation对CPU最终输出结果位图进行提交,这就构成了UI视图展示过程的CPU的全部工作。
-
接下里看好以下GPU的渲染管线的过程:
实际上GPU的渲染管线,指的就是OpenGL的渲染管线,这个过程首先会做一个顶点着色,顶点着色指的是对位图进行的处理,然后会进行图元装配、光栅化包括片段着色以及片段处理,这些步骤对于iOS来说十分陌生,以及这些部分在日常开发过程中绝大多数场景下 是接触不到的,关于渲染管线的这五个步骤做完之后就会把最终的像素点提交到对应的帧缓冲区当中,然后由视频控制器在vsync信号到来之前去帧缓冲区提取最终要显示到屏幕上的内容,这些东西就构成了OpenGL的渲染管线过程。