将数据附加到金属中MTLBuffer的现有内容



如何将数据附加到MTLBuffer?

我有以下数据集:

var verticesArray:Array<Vertex>  = [
A,B,C ,D,E,F
]

我创建了一个顶点缓冲区(MTLBuffer(,它可以存储多个顶点数组

var vertexData = Array<Float>()
for vertex in vertices{
vertexData += vertex.floatBuffer()
}
let dataSize = 1000*vertexData.count * MemoryLayout.size(ofValue: vertexData[0])
vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize, options: [])

我需要将另一组顶点附加到顶点缓冲区,如下所示。

var verticesArray2:Array<Vertex>  = [
G,H,I ,J,K,L
]

如何追加?需要帮助。

Metal 缓冲区不像Swift Array、Obj C NSMutableArray 或 C++ STL 向量。 缓冲区有固定的内存支持,因此无法调整其大小以添加/追加更多数据。

相反,您需要创建足够大的新缓冲区以容纳现有数组的数据和要追加的新元素,然后将它们复制到新的扩展缓冲区中。 由于创建缓冲区和复制的成本很高,因此最好在每次创建新缓冲区时创建添加额外的空间,以便可以多次"追加",而无需每次都创建新缓冲区和复制。 此外,如果数据位于另一个缓冲区中的 GPU 上,则应使用 MTLBlitCommandEncoder 对扩展缓冲区执行复制操作。

我想知道你最终想用这个缓冲区完成什么,因为它可能不是 Metal 的真正用途。

最新更新