更新Metal中MTLBuffer的内容 [英] Update contents of MTLBuffer in Metal

查看:207
本文介绍了更新Metal中MTLBuffer的内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要帮助来替换 MTLBuffer 的内容,而无需创建新内容.两种情况下的内容都是浮点数组.

I need help to replace the contents of a MTLBuffer without creating a new one. Content in both cases are Float Arrays.

let vector:[Float] = [0,1,2,3,4,5,6,7,8,9]   
let byteLength = arr1.count*MemoryLayout<Float>.size
let buffer = metalDevice.makeBuffer(bytes: &vector, length: byteLength, options: MTLResourceOptions())

let vector2:[Float] = [10,20,30,40,50,60,70,80,90]

我了解 buffer.contents()给了我们 UnsafeMutableRawPointer .我想从 vector2 创建一个新的UnsafeMutableRawPointer并替换缓冲区的内容.

I understand buffer.contents() gives us a UnsafeMutableRawPointer. I would like to create a new UnsafeMutableRawPointer from vector2 and replace the contents of buffer.

提前谢谢!

推荐答案

您可以使用memcpy进行此操作,但是稍微快一点的方法是:

You can do this with memcpy, but the slightly Swiftier way is:

buffer.contents().copyBytes(from: vector2, count: vector2.count * MemoryLayout<Float>.stride)

通常,在计算以字节为单位的数组长度时,优先使用stride而不是size.如果该类型不是原始类型并且具有任何填充,则size不会解决此问题,并且您复制的字节将少于您的预期.

In general, prefer stride over size when calculating the length of an array in bytes. If the type is not primitive and has any padding, size will not account for this, and you'll copy fewer bytes than you intended.

这篇关于更新Metal中MTLBuffer的内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆