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

时间:2018-06-01 04:56:59

标签: swift textures metal

如何将数据附加到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: [])

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

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

我怎么追加?需要帮助。

1 个答案:

答案 0 :(得分:1)

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

相反,您将需要创建足够大的新缓冲区以适合现有数组的数据和要添加的新元素,然后将它们复制到新的扩展缓冲区中。由于创建缓冲区和复制非常昂贵,因此最好在每次创建新缓冲区时都添加额外的空间,这样您就可以“追加”多次,而无需每次创建新缓冲区并进行复制。另外,如果数据在另一个缓冲区的GPU上,则应使用MTLBlitCommandEncoder对扩展的缓冲区执行复制操作。

我想知道您最终要使用此缓冲区来完成什么,因为它可能不是Metal的真正好用。