在Metal中更新MTLBuffer的内容

7
我需要帮助替换一个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,并替换缓冲区的内容。

先行致谢!

1个回答

23

你可以使用 memcpy 来实现这个功能,但稍微更 Swift 的方式是:

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

通常在计算数组的字节长度时,更倾向于使用 stride 而不是 size。如果数组元素的类型不是基本类型且存在填充,使用 size 将无法考虑到这一点,导致复制的字节数少于预期。


4
使用 Xcode 14 和 Swift 5.7,现在称为 copyMemory(…) - StackUnderflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接