目录
一、定义并行帧数上限
二、资源多实例化改造
2.1 批量创建命令缓冲
2.2 批量创建同步对象
三、帧索引管理:实现资源循环复用
四、修改渲染循环:实现多帧并行
核心逻辑解析
五、同步方案拓展:时间线信号量
六、总结与后续
当前我们的渲染循环存在一个明显缺陷:必须等待上一帧完全渲染完毕,才能开始记录下一帧的指令,这会导致 CPU 出现不必要的空闲等待。
解决该问题的核心方案是实现多帧并行(Frames in Flight) —— 让一帧的渲染操作与下一帧的指令记录操作并行执行,互不干扰。要实现这一点,所有在渲染过程中被访问和修改的资源都必须进行多份拷贝。因此,我们需要为每帧分配独立的命令缓冲、信号量和栅栏。在后续章节中,其他资源也需要进行多实例化,这个并行设计思路会反复用到。
一、定义并行帧数上限
首先在程序顶部定义一个常量,指定同时并行处理的最大帧数:
cpp
运行
constexpr int MAX_FRAMES_IN_FLIGHT = 2;选择 2 作为并行帧数是一个平衡性能与延迟的最优选择:
- 并行帧数为 2 时,CPU 可以在 GPU 渲染第一帧的同时