导致EXC_BAD_ACCESS的MTLBuffer内容

问题描述:

我创建了一个由float值数组填充的缓冲区。不幸的是,当我试图查询其contents()属性(当我试图调试问题时),我得到了一个EXC_BAD_ACCESS。这里的代码:导致EXC_BAD_ACCESS的MTLBuffer内容

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) 

我想知道为什么会发生崩溃。其他类似的缓冲区声明工作正常,所以我想这可能是访问内容的问题。

为了访问阵列内容,使用load方法,需要指定数组元素类型(和可选的偏移)来代替。例如:

let firstElement = inputBuffer.contents().load(fromByteOffset: 0, as: Float.self) 

等等。您试图加载第一个元素作为[Float],这可能会解释崩溃。

+0

这奏效了。谢谢。所以如果我想要整个数组,是否有任何功能?或者,当我改变偏移量时迭代元素的数量? –

+0

@AdilPatel欢迎您;)请参阅Matthijs的答案,以获取整个阵列的方法...... –

要得到整个数组,你可以这样做:

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) 
}