我正在利用GPU调用实例化.
我稍后会将其更改为一个结构,其中包含每个实例的更多数据(不仅仅是Matrix4对象).
>如何有效地将[Matrix4]对象数组复制到此缓冲区中?
>有更好的方法吗?再次,我将扩展它以使用未来更多数据的结构.
以下是我的代码的子集:
let sizeofMatrix4 = sizeof(float) * Matrix4.numberofElements()// This returns an array of [Matrix4] objects.let BoxArray = createBoxArray(parentModelVIEwMatrix)let sizeOfUniformBuffer = BoxArray.count * sizeOfMatrix4var 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.我这样做是因为我遇到了将数组视为连续内存集的问题.
谢谢!
一个Swift数组被认为是连续的内存,但你需要确保它真的是一个Swift数组而不是秘密的NSArray.如果您想完全确定,请使用ContiguousArray.这将确保连续的内存,即使其中的对象可以桥接到ObjC.如果您想要更好地控制内存,请查看ManagedBuffer.有了它,您应该使用newBufferWithBytesNocopy(length:options:deallocator)在现有内存周围创建一个MTL缓冲区.
总结以上是内存溢出为你收集整理的有效地将Swift Array复制到iOS Metal的内存缓冲区全部内容,希望文章能够帮你解决有效地将Swift Array复制到iOS Metal的内存缓冲区所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)