[toc]
# 序 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: 逻辑帧下标