Opengl

移动端GPU——渲染流程

2020-12-05  本文已影响0人  太刀
PattiSmith

1. IMR——桌面 GPU 的渲染流程

1.1 IMR 渲染特点

1.2 作为写入目标的FrameBuffer ,对显存的性能要求

在目前的移动设备硬件水平下,这三个目标通常最多只能满足两个。目前的主流选择:牺牲容量,换取更快的访问速度和更低的功耗。

2. 解决方案:TBR(Tile Based Rendering)

引入TileBuffer

2.1 SIMD 核心不直接写到 FrameBuffer,而是写到TileBuffer,TileBuffer 的内容在恰当的时候写到 FrameBuffer

TBR渲染流程

2.2 TBR 中的深度测试

TBR中的深度测试

什么情况下 Early-Z 失效?

因为 Early-Z 在PS 之前执行,所以需要必须在 PS 之前就确定深度,也就是说 执行PS时像素深度不能发生变化

2.3 移动端 GPU 的 Early-Z

移动端 GPU 的 Early-Z

2.4 性能关注点

2.4.1 顶点开销

2.4.2 Tessellation

2.4.3 充分利用 TileBuffer

TileBuffer 和主显存之间消耗大量带宽,针对这个消耗进行如下的优化

3. TBDR:基于 TileBuffer 的延迟渲染

3.1 延迟渲染传统流程

延迟渲染传统流程

3.2 移动设备上的延迟渲染(TBDR)

TBDR示意

4. 移动设备上的 MSAA

4.1 传统 MSAA 流程

传统MSAa

4.2 移动设备 MSAA 流程

移动端MSAA

5. GPU 和 CPU 协作(Frame Pacing)

5.1 基本的 FramePacing 流程

FramePacing
  • CPU 和 GPU 异步运行
  • Command Buffer 作为 CPU 和 GPU 的协议包
  • CPU 填充 CommandBuffer,在提交后(DrawCall)后 GPU 才开始执行 CommandBuffer

5.2 对 FramePacing 进行优化

目标:最大程度的并行化

CPU 帧内依赖于 GPU 执行结果的一个例子是 “硬件遮挡查询”机制,它需要 CPU 创建遮挡查询命令提交给 GPU,等待 GPU 的运算结果,再根据结果执行渲染。

5.3 垂直同步

渲染结果只能在固定的时间点显示到屏幕,比如移动设备的屏幕刷新率为 60Hz,意思是手机屏幕每秒最多进行 60 次的缓冲区交换(渲染刷新)
问题:

  1. 若某帧渲染太快,到了第一个同步点就刷新到屏幕了,而下一阵太慢,第二个同步点才刷新,则帧率不稳定,有卡顿感
  2. 若刷新率慢而帧渲染率快,未开启垂直同步的情况下,可能画面撕裂,上一个 FrameBuffer 才显示一半,下一帧 FrameBuffer 已经提交,再刷新就变成了下一帧的画面
上一篇 下一篇

猜你喜欢

热点阅读