金属最佳实践-在渲染过程中更改renderPipelineDescriptor

Eri*_*pir 2 ios swift metal ios9

在渲染管道中,我想使用一些着色器,并在某些情况下修改MTLRenderPipelineDescriptor对象上的参数(例如,更改混合功能)。

如我所见,我有2个选择:

  1. 为每种参数组合(顶点着色器,片段着色器,混合等)创建并预编译一个MTLRenderPipelineState。我可以有很多这样的状态对象,因为可能有很多组合。

  2. 在渲染过程中创建并编译新的MTLRenderPipelineState对象。

哪个选项更好?我还有其他选择吗?

Bil*_*ngs 6

为了获得最佳实践(和最佳性能),您应该遵循选择1

在“ 金属中瞬态和非瞬态对象”部分中,《金属编程指南》非常清楚地说明了哪些对象应视为瞬态或非瞬态,以及哪些非瞬态对象应被缓存和重用。

MTLRenderPipelineState特别是对于对象,这是指南在“ 创建渲染管道状态”部分中必须说的内容:

渲染管道状态对象是一个长期存在的持久对象,可以在渲染命令编码器外部创建,预先缓存并在多个渲染命令编码器之间重用。当描述同一组图形状态时,重新使用先前创建的渲染管线状态对象可以避免昂贵的操作,该操作将重新评估指定的状态并将其转换为GPU命令。