Copiar eficientemente Swift Array al búfer de memoria para iOS Metal

Estoy escribiendo una aplicación para iOS usando el nuevo framework Metal de Apple. Tengo una matriz de objetos Matrix4 (verTutorial de Ray Wenderlich) que necesito pasar a un sombreador a través del método MTLDevice.newBufferWithLength (). El objeto Matrix4 está aprovechando el GLKit de Apple (contiene un objeto GLKMatrix4).

Estoy aprovechando las instancias con las llamadas de GPU.

Más tarde cambiaré esto a una estructura que incluye más datos por instancia (más allá del objeto Matrix4.

¿Cómo puedo copiar eficientemente la matriz de objetos [Matrix4] en este búfer?

¿Hay una mejor manera de hacer esto? Nuevamente, expandiré esto para usar una estructura con más datos en el futuro.

A continuación se muestra un subconjunto de mi código:

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)

Nota: El método boxArray [i] .raw () se define así en el código Objective-C:

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

Puedes ver que estoy recorriendo cada objeto de matriz y luego haciendo una memoria. Hice esto porque tenía problemas para tratar la matriz como un conjunto contiguo de memoria.

¡Gracias!