更新Metal中MTLBuffer的内容

the*_*ker 4 ios metal

我需要帮助来替换MTLBuffer的内容而不创建新的内容.两种情况下的内容都是Float Arrays.

let vector:[Float] = [0,1,2,3,4,5,6,7,8,9]   
let byteLength = arr1.count*MemoryLayout<Float>.size
let buffer = metalDevice.makeBuffer(bytes: &vector, length: byteLength, options: MTLResourceOptions())

let vector2:[Float] = [10,20,30,40,50,60,70,80,90]
Run Code Online (Sandbox Code Playgroud)

我理解buffer.contents()为我们提供了一个UnsafeMutableRawPointer.我想从vector2创建一个新的UnsafeMutableRawPointer 并替换buffer的内容.

提前致谢!

war*_*enm 8

你可以这样做memcpy,但稍微Swiftier的方式是:

buffer.contents().copyBytes(from: vector2, count: vector2.count * MemoryLayout<Float>.stride)
Run Code Online (Sandbox Code Playgroud)

一般情况下,倾向于stridesize计算字节的数组的长度时.如果类型不是原始类型并且有任何填充,size则不会考虑到这一点,并且您将复制比预期更少的字节.

  • 在 Xcode 14 和 Swift 5.7 中,它现在称为“copyMemory(...)” (4认同)