Dea*_*xel 6 ios swift swift-array metal
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
注意:boxArray [i] .raw()方法在Objective-C代码中定义如下:
- (void *)raw {
return glkMatrix.m;
}
Run Code Online (Sandbox Code Playgroud)
您可以看到我循环遍历每个数组对象然后执行memcpy.我这样做是因为我遇到了将数组视为连续内存集的问题.
谢谢!
一个Swift数组被认为是连续的内存,但你需要确保它真的是一个Swift数组而不是秘密的NSArray.如果您想完全确定,请使用ContiguousArray.这将确保连续的内存,即使其中的对象可以桥接到ObjC.如果您想要更好地控制内存,请查看ManagedBuffer.
有了它,您应该使用newBufferWithBytesNoCopy(length:options:deallocator)在现有内存周围创建一个MTL缓冲区.
| 归档时间: |
|
| 查看次数: |
4488 次 |
| 最近记录: |