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

标签 swift textures metal

如何向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
                ]

我该如何追加?需要帮助。

最佳答案

Metal 缓冲区不是像 Swift 数组、Obj C NSMutableArray 或 C++ STL 向量。缓冲区有固定的内存支持,因此您不能调整它的大小来添加/追加更多数据。

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

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

关于swift - 将数据附加到 Metal 中 MTLBuffer 的现有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50636335/

相关文章:

iOS - Crashlytics - 缺少几次崩溃

swift - 如何使用对考虑的位数的限制来搜索数组?

objective-c - 我如何复制另一个Texture2D的一部分来创建自己的Texture2D

ios - 响应 iOS 中的 RAM 可用性

ios - 我们是否需要为每次绘制创建一个新的 RenderPassDescriptor,或者我们可以缓存它并重用它?

ios - 如何创建过去的新 NSDate 对象,例如比另一个日期早 1 秒?

ios - 将基本 Storyboard的本地化更改为德国 swift xcode

ios - 在 SpriteKit 中预加载纹理

ios - texturecube 和 texture3d 的区别

ios - 如果 `MPSCNNConvolutionDataSource` 协议(protocol)的 `load` 方法返回 false 会发生什么?