如何将动态大小的超大数组传递给 Metal Argument 缓冲区?
How to pass dynamic sized super large array to Metal Argument buffers?
我有一个包含超过 100 万个结构实例的大型数组。大小实际上是动态的。
它与 MTLBuffer
一起工作正常,它似乎是 Metal 着色器中的指针,我不必写一些硬编码的大小或长度。
问题是,我不想为每一帧绑定或设置它。所以,我正在研究 ArgumentBuffers
和 Heap
。但是我没有为我的用例找到解决方案或示例。看起来 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]
一起使用。
它是在没有任何硬编码大小的情况下完成的。
我有一个包含超过 100 万个结构实例的大型数组。大小实际上是动态的。
它与 MTLBuffer
一起工作正常,它似乎是 Metal 着色器中的指针,我不必写一些硬编码的大小或长度。
问题是,我不想为每一帧绑定或设置它。所以,我正在研究 ArgumentBuffers
和 Heap
。但是我没有为我的用例找到解决方案或示例。看起来 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]
一起使用。
它是在没有任何硬编码大小的情况下完成的。