知识卡片
管线对象化:把最贵的编译工作做一次、存起来
内容
着色器模块本身只是SPIR-V代码,真正影响设备最终执行代码的,是把着色器和其余管线状态(输入格式、混合方式等)一起打包成的”管线对象”——只有到创建管线对象这一步,驱动才第一次看到全部会影响生成代码的信息,因此很多实现会把最耗时的着色器编译和代码生成工作一直推迟到这一刻才做。因为应用程序通常会反复用同一套状态组合创建管线,Vulkan提供”管线缓存”对象,把之前编译好的结果存下来,写入磁盘、下次运行时预加载,就能让原本很慢的启动期管线构建变快,还支持多线程各自持有缓存、最后合并,避免驱动内部锁的竞争。这是”把状态完整收集后一次性编译,并把编译结果跨会话缓存”的思路:只要输入组合没变,就没必要每次都重新做一遍最贵的那一步。
参考来源
《Vulkan 应用开发指南》第6章《着色器和管线》