Эффективное копирование 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. Я сделал это, так как у меня возникли проблемы с обработкой массива как непрерывного набора памяти.
Спасибо!