何时使用多个MTLRenderCommandEncoders执行我的Metal渲染?

问题描述 投票:0回答:1

我正在学习Metal,并且有一个概念性问题在试图解决:在什么级别上,我的代码应该处理需要不同管线状态的连续绘制操作?据我了解(从这样的答案:https://stackoverflow.com/a/43827775/2752221),我可以使用单个MTLRenderCommandEncoder并在调用drawPrimitives:和更改编码器状态之间更改其流水线状态,其使用的顶点缓冲区等。每次调用drawPrimitives:时的当前值将被保留。太好了。但是似乎Metal的设计也是如此,它可以制作多个MTLRenderCommandEncoder实例,并使用它们依次将成批的命令放入MTLCommandBuffer中。鉴于前者有效-使用一个MTLRenderCommandEncoder并更改其状态-为什么后者会起作用?前者在什么情况下是正确的,后者在什么情况下有必要?在后者是必要/适当的情况下,有什么例子?

[如果有问题,我正在使用Objective-C开发macOS应用。谢谢。

objective-c metal
1个回答
0
投票
忽略多线程编码的情况,这些情况有些先进,要在一个帧中创建多个渲染命令编码器的主要原因是,您需要更改要渲染到的纹理。

您会注意到,创建渲染命令编码器时需要提供渲染过程描述符。因此,我们经常说属于特定编码器的命令序列构成

render pass。该描述符的附件是指将由编码器编码的命令写入的纹理。

[许多不同的技术,包括阴影贴图和后处理效果(例如光晕)需要多次通过才能产生。由于您无法在通过过程中更改附件,因此创建新的编码器是在一个帧中对多个通过进行编码的唯一方法。

相关地,通常应该每帧使用一个命令缓冲区。但是,有时可以通过在多个命令缓冲区之间分割传递来减少帧时间,但这在很大程度上取决于工作负载的形状,并且仅应在概要分析之后进行,因为有时这是一种悲观的看法。

© www.soinside.com 2019 - 2024. All rights reserved.