Эффективное копирование Swift Array в буфер памяти для iOS Metal

Я пишу приложение для iOS, используя новый металлический каркас Apple. У меня есть массив объектов Matrix4 (см.Рэй Вендерлих учебник), что мне нужно передать в шейдер с помощью метода MTLDevice.newBufferWithLength (). Объект Matrix4 использует GLKit от Apple (он содержит объект GLKMatrix4).

Я использую экземпляры с вызовами GPU.

Позже я изменю это на структуру, которая включает в себя больше данных для каждого экземпляра (кроме объекта Matrix4).

Как эффективно скопировать массив объектов [Matrix4] в этот буфер?

Есть лучший способ сделать это? Опять же, я расширю это, чтобы использовать структуру с большим количеством данных в будущем.

Ниже приведено подмножество моего кода:

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)

Примечание. Метод boxArray [i] .raw () определяется следующим образом в коде Objective-C:

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

Вы можете видеть, что я перебираю каждый объект массива, а затем делаю memcpy. Я сделал это, так как у меня возникли проблемы с обработкой массива как непрерывного набора памяти.

Спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос