有效地将Swift Array复制到iOS Metal的内存缓冲区
发布时间:2020-12-14 05:22:01 所属栏目:百科 来源:网络整理
导读:我正在使用Apple的新Metal框架编写iOS应用程序.我有一个Matrix4对象数组(见 Ray Wenderlich’s tutorial),我需要通过MTLDevice.newBufferWithLength()方法传入着色器. Matrix4对象正在利用Apple的GLKit(它包含一个GLKMatrix4对象). 我正在利用GPU调用实例化.
我正在使用Apple的新Metal框架编写iOS应用程序.我有一个Matrix4对象数组(见
Ray Wenderlich’s tutorial),我需要通过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) 注意: - (void *)raw { return glkMatrix.m; } 您可以看到我循环遍历每个数组对象然后执行memcpy.我这样做是因为我遇到了将数组视为连续内存集的问题. 谢谢!
一个Swift数组被认为是连续的内存,但你需要确保它真的是一个Swift数组而不是秘密的NSArray.如果您想完全确定,请使用ContiguousArray.这将确保连续的内存,即使其中的对象可以桥接到ObjC.如果您想要更好地控制内存,请查看ManagedBuffer.
有了它,您应该使用newBufferWithBytesNoCopy(length:options:deallocator)在现有内存周围创建一个MTL缓冲区. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |