4

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

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

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

4

1 回答 1

3

让我回答我自己的问题。支持参数缓冲区内的动态大小数组。我们需要支持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]or一起使用theBuffer[1]

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

于 2021-06-11T05:23:30.017 回答