知识卡片

副命令缓冲区:用继承状态换取并行录制

专业/工作 · 117

内容

一个渲染通道的开始和结束必须落在同一个命令缓冲区里,这意味着如果整个复杂场景只用一个命令缓冲区录制,多线程并行录制命令就无从谈起。副命令缓冲区解决了这个问题:可以把渲染工作拆到多个线程,各自录制一段副命令缓冲区,最后由持有这个渲染通道的主命令缓冲区依次调用它们。但命令缓冲区之间默认不共享任何状态——哪怕是紧接着顺序执行的两个命令缓冲区,每一个开始时的管线绑定、动态状态都是未定义的,必须重新设置一遍。对一个大命令缓冲区来说这点开销可以忽略,但如果主命令缓冲区要调用大量短小的副命令缓冲区,每个都重新设置全部状态的开销就很可观了。Vulkan因此提供”继承信息”,让副命令缓冲区显式声明自己将在哪个渲染通道、哪个子通道、哪个帧缓冲区的语境下执行,减少不必要的重复设置。这提醒了一个通用教训:把大任务拆给多线程并行处理时,拆分单元越小,”单元之间无法共享上下文”的固定开销占比就越显著,需要专门的机制把可预知的上下文显式传递过去,而不是每个单元都从零开始。

参考来源

《Vulkan 应用开发指南》第13章《多通道渲染》