2017-06-03 6 views
2

Ich habe einen Puffer erstellt, der von einem Array von Float-Werten ausgefüllt wurde. Leider, wenn ich versuche, seine contents() Eigenschaft abzufragen (als ich versuchte, ein Problem zu debuggen), erhielt ich eine EXC_BAD_ACCESS. Hier ist der Code:Inhalt von MTLBuffer verursacht 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) 

Ich würde gerne wissen, warum der Absturz auftritt. Andere ähnliche Pufferdeklarationen haben korrekt funktioniert, also könnte dies ein Problem beim Zugriff auf den Inhalt sein.

Antwort

1

Um mit der Methode load auf den Array-Inhalt zuzugreifen, müssen Sie stattdessen das Array Elementtyp (und einen optionalen Offset) angeben. Zum Beispiel:

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

und so weiter. Sie haben versucht, das erste Element als [Float] zu laden, was den Absturz erklären könnte.

+0

, die den Trick tat. Vielen Dank. Also, wenn ich das gesamte Array haben möchte, gibt es irgendeine Funktion? Oder iteriere ich über die Anzahl der Elemente, während ich den Offset ändere? –

+0

@AdilPatel Sie sind willkommen;) Bitte sehen Sie sich Matthijs Antwort für eine Möglichkeit an, das gesamte Array zurück zu bekommen ... –

1

das gesamte Array zu erhalten, können Sie tun:

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