Copiar com eficiência o Swift Array para o buffer de memória do iOS Metal

Estou escrevendo um aplicativo iOS usando a nova estrutura Metal da Apple. Eu tenho uma matriz de objetos Matrix4 (consulteO tutorial de Ray Wenderlich) que eu preciso passar para um shader pelo método MTLDevice.newBufferWithLength (). O objeto Matrix4 está aproveitando o GLKit da Apple (ele contém um objeto GLKMatrix4).

Estou aproveitando o instanciamento com as chamadas da GPU.

Mais tarde, mudarei isso para uma estrutura que inclui mais dados por instância (além do objeto Matrix4.

Como copiar eficientemente a matriz de objetos [Matrix4] para esse buffer?

Existe uma maneira melhor de fazer isso? Mais uma vez, expandirei isso para usar uma estrutura com mais dados no futuro.

Abaixo está um subconjunto do meu 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: O método boxArray [i] .raw () é definido como este no código Objective-C:

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

Você pode ver que eu estou percorrendo cada objeto da matriz e fazendo um memcpy. Fiz isso desde que tive problemas ao tratar a matriz como um conjunto contíguo de memória.

Obrigado!

questionAnswers(3)

yourAnswerToTheQuestion