[toc]

# 序 RHI 前端

# 流程图

即从引擎层深入到 RHI 层的流程,流程主要如下:

  • Engine 的每次 Run 中进入两个 Tick
    • 逻辑 Tick
    • 渲染 Tick
  • 渲染 Tick 分为 SurfaceTick 和 handles 处理
    • SurfaceTick 中进入 RHI 的渲染流程和 UI 的渲染流程
    • handles 中的处理 handle 是来自 RHI 中的反向注册
  • RHI 流程
    • 绘制 Frame
    • 产生 Handles
  • handles 处理实际的 Mesh,Material, 骨骼等

# Vulkan 延迟渲染流程

# 1. FrameBuffer

帧缓冲区,用于缓冲渲染完毕的显示,为了保证渲染时尽量避免出现撕裂的现象,所以采用了交换显示帧缓冲图像的方式进行渲染. Pilot 的帧缓冲在 ThreeFrameBuffers 中,内部总共包括了三个 Buffer, 在实际的框架编写中,Pilot 采用了 生产者 - 消费者模型 这个模型比较易于处理多线程或异步生产数据时的处理顺序问题。比如计算一帧图像的内容可能会很快,在实际显示一帧的过程中又渲染好了几帧.
- 其中计算一帧图像就是生产者,实际显示一帧就是消费者.
- 每次生产者生产完图形放到 FrameBuffer 池中 - 消费者从池中拿到一帧渲染到屏幕上

# ThreeFrameBuffers 类

参数

  • TriBuffer: 实际存储帧缓冲的数据
  • m_logical_frame_index: 当前显示的帧缓冲的逻辑下标
  • m_last_producing_index: 最后一次生产的图像的下标
  • m_producing_index: 生产的下标
  • m_consuming_index: 消费的下标

方法

  • initialize: 初始化
    • 在初始化的时候,将场景赋值给帧缓冲 (暂时只支持单场景渲染)
  • clear: 清除缓冲区
  • producingBufferShift: 反转生产者缓冲区
  • getProducingBuffer: 获取生产者缓冲区
  • consumingBufferShift: 反转消费缓冲区
  • getConsumingBuffer: 获取消费者缓冲区

# FrameBuffer 类

实际的一个帧缓冲的类

  • m_renderpath: PRenderPath 枚举,指定当前帧是前向、后向、还是群组渲染
  • m_scene: 当前渲染的目标场景
  • m_uistate: 当前渲染的目标 ui
  • logicalFrameIndex: 逻辑帧下标