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

Posted

技术标签:

【中文标题】将数据附加到 Metal 中 MTLBuffer 的现有内容【英文标题】:append data to existing contents of MTLBuffer in Metal 【发布时间】:2018-06-01 04:56:59 【问题描述】:

如何将数据追加到 MTLBuffer?

我有以下数据集:

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

我创建了一个可以存储多个顶点数组的vertexBuffer(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】:

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

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

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

【讨论】:

感谢endomachi的回答。我只是想弄清楚金属中的概念。实际上后来我意识到它并不是你提到的金属的真正用途。

以上是关于将数据附加到 Metal 中 MTLBuffer 的现有内容的主要内容,如果未能解决你的问题,请参考以下文章

何时可以安全地重写和重用 MTLBuffer 或其他 Metal 顶点缓冲区?

将 Metal 缓冲区传递给 SceneKit 着色器

将未对齐的缓冲区提供给 MTLBuffer 是不是安全?

有没有像 Metal 中的 clCreateSubBuffer 一样的方法?

SceneKit 中的金属生成网格

苹果的 Metal 工程