有效地将Swift Array复制到iOS Metal的内存缓冲区

我正在使用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)

注意:
BoxArray [i] .raw()方法在Objective-C代码中定义如下:

- (void *)raw {
    return glkMatrix.m;
}

您可以看到我循环遍历每个数组对象然后执行memcpy.我这样做是因为我遇到了将数组视为连续内存集的问题.

谢谢!

一个Swift数组被认为是连续的内存,但你需要确保它真的是一个Swift数组而不是秘密的NSArray.如果您想完全确定,请使用ContiguousArray.这将确保连续的内存,即使其中的对象可以桥接到ObjC.如果您想要更好地控制内存,请查看ManagedBuffer.

有了它,您应该使用newBufferWithBytesNocopy(length:options:deallocator)在现有内存周围创建一个MTL缓冲区.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...