swift - 将数据附加到 Metal 中 MTLBuffer 的现有内容
问题描述
如何将数据附加到 MTLBuffer?
我有以下数据集:
var verticesArray:Array<Vertex> = [
A,B,C ,D,E,F
]
我创建了一个可以存储多个顶点数组的 vertexBuffer(MTLBuffer)
var vertexData = Array<Float>()
for vertex in vertices{
vertexData += vertex.floatBuffer()
}
let dataSize = 1000*vertexData.count * MemoryLayout.size(ofValue: vertexData[0])
vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize, options: [])
我需要将另一组顶点附加到 vertexBuffer,如下所示。
var verticesArray2:Array<Vertex> = [
G,H,I ,J,K,L
]
我该如何追加?需要帮忙。
解决方案
Metal 缓冲区与Swift Array、Obj C NSMutableArray 或 C++ STL 向量不同。缓冲区有固定的内存支持,因此您无法调整其大小以添加/追加更多数据。
相反,您需要创建足够大的新缓冲区以容纳现有数组的数据和要附加的新元素,然后将它们复制到新的扩展缓冲区中。由于创建缓冲区和复制成本很高,因此最好在每次创建新缓冲区时添加额外的空间,这样您就可以“追加”多次,而无需每次都创建新缓冲区和复制。此外,如果数据在 GPU 上的另一个缓冲区中,则应使用 MTLBlitCommandEncoder 执行复制操作到扩展缓冲区。
我想知道你最终试图用这个缓冲区完成什么,因为它可能不是一个真正伟大的金属用途。
推荐阅读
- mysql - MySQL Regex 如果字符串在 5 位数字后包含连字符
- postgresql - 将 Apache Airflow 配置为使用 postgres 数据库时出错
- javascript - Paperjs 在不使用 Paperjs 代码时导致类语法错误
- javascript - Javascript 表单验证不适用于注册弹出表单
- c# - 在 Entity Framework Core 3 中使用 TransactionScope 时,SET IDENTITY_INSERT 不起作用
- r - 在 ggplot2 刻面之间添加空格和三个点(省略号)以指示省略的刻面
- javascript - VueJS 在创建的函数中返回未定义
- c# - 绑定到 Entry.Text 的属性设置器无限循环
- python - 避免 django 设置文件中的代码重复
- opencv - openCV Canny 边缘检测改进