一、Graphics Processing Unit
GPU为图形处理单元;
一般将GPU与CPU放在一起对比:
CPU的强项是做逻辑运算,GPU的强项是做数学运算和图形渲染;
双方都是运算处理器,从结构上来讲都包含运算单元ALU、控制单元Control和缓存单元Cache;
所以结果上CPU的运算能力更加均衡,但是不适合做大量的运算;GPU更适合做大量运算;
CPU基本上是实时响应,采用多级缓存来保障多个任务的响应速度;
GPU往往采用的是批处理的机制,即:任务先排好队,挨个处理。
二、图元到位图
输入图元
该阶段由CPU负责,应用可能对图像进行一系列操作,最终形成新的图像信息传给下一阶段;
该图像信息叫做图元(primitives),通常为三角形、线段、顶点。
处理图元
该阶段包括之后由GPU负责,对得到的图元进行处理,GPU流水线(或称渲染管线);
顶点数据;
顶点着色器:将图元中的顶点信息进行视角转换、添加光照信息、增加纹理等操作;
形状(图元)装配:三角形、线段、点分别对应三个、两个、一个Vertex,会将Vertex连接成对应的形状;
几何着色器:添加额外的Vertex,基于三角形、线段和点构建更复杂的几何图形;
光栅化:将几何渲染后的图元信息转换为一系列的图像(图元转换为像素)。
处理像素得到位图
片段着色器(Fragment Shader):Pixel Shader,给予每个像素Pixel正确的颜色,颜色来源于之前得到的顶点、纹理、光照等信息;
测试与混合:(模版测试Mask、深度测试),通过测试后Merging,处理片段前后位置以及透明度。
屏幕成像
GPU渲染结束之后的像素信息,被存储在帧缓冲器(Framebuffer)中,之后视频控制器(Video Controller)会读取帧缓冲器中的信息;
经过数模转换传递给显示器(Monitor),进行显示;
CPU+GPU的渲染流程是一个耗时的过程,如果在电子束扫描新的一帧时,位图还未渲染好,而是在扫描到屏幕中间时才渲染完成,被放入帧缓冲器中,会造成屏幕撕裂;
提高显示效率的策略是使用垂直同步信号Vsync与双缓冲机制Double Buffering,垂直同步信号相当于给帧缓冲器加锁:
当电子束完成一帧的扫描,将要从头开始扫描时,就会发出一个垂直同步信号。只有当视频控制器收到后,才会将帧缓冲器中的位图更新为下一帧,这样就能保证每次显示的都是同一帧画面,避免了屏幕撕裂;
双缓冲机制会增加一个备用缓冲器(back buffer),渲染结果会预先保存在备用缓冲器中,在接收到Vsync信号时,视频控制器会将备用缓冲器的内容置换到帧缓冲器中,保证置换操作在一瞬间完成(实际上是交换了内存地址);
启用Vsync+Double Buffering会导致掉帧问题:
如果在接收到Vsync是CPU+GPU还未渲染好新的位图,视频控制器就不会替换帧缓冲器中的位图;
Triple Buffering:在掉帧的时候,CPU和GPU有一段时间处于闲置状态,增加一个缓冲器,就能合理利用进行下一步的渲染,并将渲染结果暂存在新增的帧缓冲器中。
离屏渲染
普通渲染流程是App通过CPU+GPU不停将内容渲染完成放入帧缓冲器(Framebuffer)中,屏幕不断从帧缓冲器中获取内容并实时显示;
离屏渲染是需要额外创建离屏渲染缓冲区(Offscreen Buffer),将提前渲染好的内容放入其中,等到合适的时机再将其中的内容进一步叠加、渲染,完成后将结果切换到帧缓冲器中;
相对而言创建离屏缓冲需要额外的内存消耗,但是若需要显示的是一个频次很高的位图相对而言就会节省之前的计算过程,所以在实际开发中可以按条件控制。