从GPU到屏幕渲染

一、Graphics Processing Unit

GPU为图形处理单元;
一般将GPU与CPU放在一起对比:
CPU的强项是做逻辑运算,GPU的强项是做数学运算和图形渲染;
双方都是运算处理器,从结构上来讲都包含运算单元ALU、控制单元Control和缓存单元Cache;
GPU与CPU的结构
所以结果上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),将提前渲染好的内容放入其中,等到合适的时机再将其中的内容进一步叠加、渲染,完成后将结果切换到帧缓冲器中;
相对而言创建离屏缓冲需要额外的内存消耗,但是若需要显示的是一个频次很高的位图相对而言就会节省之前的计算过程,在其他开发过程中也有考虑空间与时间交换的问题,这都是可以权衡的。

三、Metal

对于Apple设备来说,Apple提供了自己的Metal图形渲染技术,这种技术侧重于减少GPU驱动的工作量,从而当Metal调用时,CPU的消耗将降至最低;
Metal提供了一套统一流程化的API,使得开发者可以更方便地使用GPU进行图形渲染,这套API简化了OpenGL ES的使用,降低了开发门槛,提高了开发效率;
Metal支持预编译的着色器,这使得开发者可以预先编写渲染代码,然后在运行时加载和使用这些着色器,这种方式可以提高渲染效率,减少运行时的计算量;
Metal支持高效的多线程渲染,这意味着开发者可以将渲染任务拆分成多个线程来执行,从而充分利用多核CPU的计算能力,这种多线程渲染技术可以避免线程阻塞和等待,提高渲染效率;
Metal提供了更底层的渲染控制能力,例如直接控制缓冲区、自定义渲染命令等,这些能力使得开发者可以更精细地控制渲染过程,实现更高效的渲染效果。

  • 31
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值