如何将动态大小的超大数组传递给 Metal Argument 缓冲区?

How to pass dynamic sized super large array to Metal Argument buffers?

我有一个包含超过 100 万个结构实例的大型数组。大小实际上是动态的。 它与 MTLBuffer 一起工作正常,它似乎是 Metal 着色器中的指针,我不必写一些硬编码的大小或长度。

问题是,我不想为每一帧绑定或设置它。所以,我正在研究 ArgumentBuffersHeap。但是我没有为我的用例找到解决方案或示例。看起来 ArgumentBuffers 中数组中的所有内容都将占据一些位置。这对我的大型阵列来说不是一个好主意。我没有找到在 ArgumentBuffers 中有指针的好例子。

毕竟,我的用例的最佳实践是什么?

让我回答我自己的问题。支持参数缓冲区内的动态大小数组。我们需要支持 Metal 2 Tier 2.

的设备
[argumentEncoder setArgumentBuffer:_argumentBuffer startOffset:0 arrayElement:0];
// Then, write some code to fill the data for first element
[argumentEncoder setArgumentBuffer:_argumentBuffer startOffset:0 arrayElement:1];
// Then, write some code to fill the data for second element

而在 GPU 方面,您可以简单地使用下面的指针引用。

constant TheBufferTypeName* theBuffer [[buffer(0)]]

然后,与 theBuffer[0]theBuffer[1] 一起使用。

它是在没有任何硬编码大小的情况下完成的。