我正在使用苹果的新Metal框架编写iOS应用程序。我有一个Matrix4对象数组(请参见Ray Wenderlich's tutorial),需要通过MTLDevice.newBufferWithLength()方法传递到着色器中。Matrix4对象利用了苹果的GLKit(它包含一个GLKMatrix4对象)。
我正在使用GPU调用进行实例化。
稍后我将把这个数组更改为一个结构体,该结构体包括每个实例的更多数据(不仅仅是Matrix4对象)。
以下是我的代码子集:
1.如何有效地将[Matrix4]对象数组复制到此缓冲区中?
2.是否有更好的方法来处理这个问题?再次强调,我将来会扩展它以使用包含更多数据的结构体。
注意: 在Objective-C代码中,boxArray[i].raw()方法定义如下:
你可以看到我正在循环遍历每个数组对象,然后进行memcpy操作。我这样做是因为在将数组视为连续内存块时遇到了问题。
谢谢!
我正在使用GPU调用进行实例化。
稍后我将把这个数组更改为一个结构体,该结构体包括每个实例的更多数据(不仅仅是Matrix4对象)。
以下是我的代码子集:
1.如何有效地将[Matrix4]对象数组复制到此缓冲区中?
2.是否有更好的方法来处理这个问题?再次强调,我将来会扩展它以使用包含更多数据的结构体。
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)
注意: 在Objective-C代码中,boxArray[i].raw()方法定义如下:
- (void *)raw {
return glkMatrix.m;
}
你可以看到我正在循环遍历每个数组对象,然后进行memcpy操作。我这样做是因为在将数组视为连续内存块时遇到了问题。
谢谢!