我正在使用 Apple 的新 Metal 框架编写一个 iOS 应用程序。我有一个 Matrix4 对象数组(请参阅Ray Wenderlich 的教程),我需要通过 MTLDevice.newBufferWithLength() 方法将其传递给着色器。Matrix4 对象利用 Apple 的 GLKit(它包含一个 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。我这样做是因为我在将数组视为一组连续的内存时遇到了问题。
谢谢!