【发布时间】:2021-08-07 23:39:24
【问题描述】:
我有一个包含超过 100 万个结构实例的大型数组。大小实际上是动态的。
它适用于MTLBuffer,它似乎是金属着色器中的一个指针,我不必编写一些硬编码的大小或长度。
问题是,我不想为每一帧绑定或设置它。所以,我正在调查ArgumentBuffers 和Heap。但是我没有为我的用例找到解决方案或示例。看起来 ArgumentBuffers 中数组中的所有内容都将占用一些插槽。这对我的大型阵列来说不是一个好主意。而且我没有找到在 ArgumentBuffers 中有指针的好例子。
毕竟,我的用例的最佳实践是什么?
【问题讨论】:
-
有点不清楚您在问什么或问题出在哪里。您是否尝试将大数组作为参数缓冲区中的单个缓冲区传递?或者您是否希望结构的每个实例成为参数缓冲区中的单独字段?你想节省内存或时间或两者兼而有之?代码示例/sn-p 在这里会有所帮助。
-
@Itai 嗨,我需要数组在使用参数缓冲区时仍然作为单个缓冲区工作。目的是减少 [.... setBuffer ... offset ... atIndex ...] 的代码,在渲染循环中使用更少的代码。
-
我的意思是,与任何数组一样,您需要一个指向数组开头的指针和许多元素。您可以创建一个具有此指针和元素数量的单个参数缓冲区并仅绑定它。然后使用
MTLArgumentEncoder填充它。之后,您只需要通过调用useResource来标记间接使用的缓冲区(意味着它在AB中编码,但未使用)。