我创建了一个由浮点值数组填充的缓冲区。不幸的是,当我尝试查询其contents()
属性时(当我尝试调试问题时),我得到了一个EXC_BAD_ACCESS。这是代码:
let inputData = [Float32](repeatElement(5, count: 16384)) // Declaration
// Declaration of the buffer and filling contents...
inputBuffer = device.makeBuffer(bytes: inputData, length: MemoryLayout<Float32>.size * inputData.count, options: MTLResourceOptions())
// Crash occurs here:
let contents = inputBuffer.contents().load(as: [Float32].self)
我想知道崩溃发生的原因。其他类似的缓冲区声明工作正常,所以我想这可能是访问内容的问题。
答案 0 :(得分:1)
要使用load
方法访问数组内容,您需要指定数组元素类型(和可选的偏移量)。例如:
let firstElement = inputBuffer.contents().load(fromByteOffset: 0, as: Float.self)
等等。您试图将第一个元素作为[Float]
加载,这可能会解释崩溃。
答案 1 :(得分:1)
要获得整个阵列,您可以这样做:
let count = buffer.length / MemoryLayout<Float>.stride
var output = [Float](repeating: 0, count: count)
_ = output.withUnsafeMutableBytes { ptr in
memcpy(ptr.baseAddress, buffer.contents(), buffer.length)
}