【发布时间】:2020-06-06 20:58:41
【问题描述】:
我有一个传递可选 MTLBuffer 的函数。我的目标是使用索引迭代地更改该缓冲区中的值到指向同一缓冲区的类型化指针。但是,当我运行代码时,出现错误“线程 1:EXC_BAD_ACCESS (code=2, address=0x1044f1000)”。
我是否正确转换为 Typed UnsafeMutablePointer?
转换为类型化的 UnsafeMutableBufferPointer 会更好吗?如果是这样,我将如何从 MTLBuffer 转换为 Typed UnsafeMutableBufferPointer?
知道为什么会出现此错误吗?
注意:为了简单起见,我删除了大多数警戒检查。我已经确认 MTLDevice(通过设备)、bufferA 分配、dataPtr 和 floatPtr 都不是 nil。 floatPtr 和 dataPtr 确实指向同一个内存地址。
这是我分配缓冲区的方式:
bufferSize = 16384
bufferA = device?.makeBuffer(length: bufferSize, options: MTLResourceOptions.storageModeShared)`
这是我在缓冲区上运行的代码:
guard let dataPtr = bufferA?.contents() else {
fatalError("error retrieving buffer?.contents() in generateRandomFloatData()")
}
let floatPtr = dataPtr.bindMemory(to: Float.self, capacity: bufferA!.length)
for index in 0...bufferSize - 1 {
floatPtr[index] = 1.0 // Float.random(in: 0...Float.greatestFiniteMagnitude)
}
谢谢!
【问题讨论】: