Ich schreibe eine iOS-Anwendung mit Apples neuem Metal-Framework. Ich habe ein Array von Matrix4-Objekten (siehe Ray Wenderlich's tutorial), die ich über die MTLDevice.newBufferWithLength() -Methode an einen Shader übergeben muss. Das Matrix4-Objekt nutzt Apples GLKit (es enthält ein GLKMatrix4-Objekt).Effizientes Kopieren von Swift Array in Speicherpuffer für iOS Metal
Ich nutze Instanziierung mit den GPU-Anrufen.
Ich werde später in diesem auf eine Struktur ändern, die mehr Daten pro Instanz enthält (über die reine MATRIX4 Objekt.
Wie kann ich das Array effizient kopieren von [MATRIX4] Objekte in diesen Puffer?
gibt es einen besseren Weg, dies zu tun Noch einmal, ich diese erweitern werde eine Struktur mit mehr Daten in der Zukunft verwenden
Unten finden Sie eine Teilmenge von meinem Code ist?.:
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 boxArray [i] .RAW() -Methode, wie dies in dem Objective-C-Code definiert ist:
- (void *)raw {
return glkMatrix.m;
}
Sie können sehen, ich durch jedes Array-Objekt bin Looping und dann memcpy machen. Ich tat dies, da ich Probleme hatte, das Array als eine zusammenhängende Menge von Speicher zu behandeln.
Danke!
Sie sollten simd.float4x4 verwenden. – Jessy