更新 Metal 中 MTLBuffer 的内容

Update contents of MTLBuffer in Metal

我需要帮助来替换 MTLBuffer 的内容而不创建新内容。两种情况下的内容都是浮点数组。

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]

我明白 buffer.contents() 给了我们一个 UnsafeMutableRawPointer。我想从 vector2 创建一个新的 UnsafeMutableRawPointer 并替换 buffer.

的内容

提前致谢!

您可以使用 memcpy 执行此操作,但更快捷的方法是:

buffer.contents().copyBytes(from: vector2, count: vector2.count * MemoryLayout<Float>.stride)

通常,在计算数组的字节长度时,首选 stride 而不是 size。如果类型不是原始类型并且有任何填充,size 将不会考虑这一点,并且您将复制比预期更少的字节。