知识卡片
动态状态:给高频变化的属性开一条快速通道
内容
图形管线把光栅化、混合、视口等一大堆状态打包成一个对象,本意是让驱动提前掌握全部信息、把这些状态尽早编译进最终代码(参见[[管线对象化把最贵的编译工作做一次存起来]])。但这带来一个矛盾:如果视口大小、线宽这类经常需要逐帧甚至逐个物体调整的小属性也被锁死在管线对象里,那每次调整都要重新创建一个几乎相同的管线,创建管线的开销通常是应用中最贵的操作之一。Vulkan的解决办法是让开发者显式声明哪些状态是”动态”的——这部分状态不再固化进管线,而是可以在命令缓冲区里用专门的命令随时更新,代价是驱动少了一部分提前优化的机会。这是”批量固化换性能”和”频繁调整换灵活性”两种诉求之间的一个折中口子:默认把状态固化到底以便优化,但对那些确实需要频繁变化的维度单独开洞,而不是让整个系统在灵活性和性能之间二选一。
参考来源
《Vulkan 应用开发指南》第7章《图形管线》