Effizientes Kopieren von Swift Array in den Speicherpuffer für iOS Metal

Ich schreibe eine iOS-Anwendung mit Apples neuem Metal-Framework. Ich habe ein Array von Matrix4-Objekten (sieheRay Wenderlichs Tutorial), die ich über die Methode MTLDevice.newBufferWithLength () an einen Shader übergeben muss. Das Matrix4-Objekt nutzt das GLKit von Apple (es enthält ein GLKMatrix4-Objekt).

Ich nutze Instanzen für die GPU-Aufrufe.

Ich werde dies später in eine Struktur ändern, die mehr Daten pro Instanz enthält (über das Matrix4-Objekt hinaus).

Wie kann ich das Array von [Matrix4] -Objekten effizient in diesen Puffer kopieren?

Gibt es einen besseren Weg, dies zu tun? Ich werde dies nochmals erweitern, um in Zukunft eine Struktur mit mehr Daten zu verwenden.

Below ist eine Teilmenge meines Codes:

let sizeofMatrix4 = sizeof(Float) * Matrix4.numberofElements()

// This returns an array of [Matrix4] objects.
let boxArray = createBoxArray(parentModelViewMatrix)

let sizeOfUniformBuffer = boxArray.count * sizeOfMatrix4
var uniformBuffer = device.newBufferWithLength(sizeofUniformBuffer, options: .CPUCacheModeDefaultCache)
let bufferPointer = uniformBuffer?.contents()

// Ouch - way too slow.  How can I optimize?
for i in 0..<boxArray.count
{
    memcpy(bufferPointer! + (i * sizeOfMatrix4), boxArray[i].raw(), sizeOfMatrix4)
}

renderEncoder.setVertexBuffer(uniformBuffer, offset: 0, atIndex: 2)

Hinweis: Die Methode boxArray [i] .raw () ist im Objective-C-Code wie folgt definiert:

- (void *)raw {
    return glkMatrix.m;
}

Sie können sehen, dass ich jedes Array-Objekt durchschleife und dann ein Memcpy durchführe. Ich habe dies getan, da ich Probleme damit hatte, das Array als zusammenhängenden Speichersatz zu behandeln.

Vielen Dank