【问题标题】:MTLBuffer contents causing EXC_BAD_ACCESSMTLBuffer 内容导致 EXC_BAD_ACCESS
【发布时间】:2017-11-04 16:38:54
【问题描述】:

我创建了一个由浮点值数组填充的缓冲区。不幸的是,当我尝试查询它的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)

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

【问题讨论】:

    标签: ios swift buffer metal


    【解决方案1】:

    要访问数组内容,使用load 方法,您需要指定数组元素类型(以及可选的偏移量)。例如:

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

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

    【讨论】:

    • 成功了。谢谢。所以如果我想要整个数组,有什么功能吗?还是在更改偏移量时迭代元素的数量?
    • @AdilPatel 不客气 ;) 请参阅 Matthijs 的回答,了解如何恢复整个数组...
    【解决方案2】:

    要获取整个数组,可以这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-27
      • 2016-11-19
      • 2012-10-02
      • 2011-04-14
      • 2017-03-15
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多