ios - 创建后更改 MTLBuffer 的值

标签 ios buffer metal mtlbuffer

我希望能够定义一个 MTLBuffer 并将数据直接填充到缓冲区(或尽可能高效)。

如果我执行以下操作,着色器中使用的值为 1.0 和 2.0(分别针对 X 和 Y),而不是创建 MTLBuffer 之后设置的 3.0 和 4.0。

int bufferLength = 128 * 128;

float pointBuffer[bufferLength * 2]; // 2 for X and Y

//Populate array with test values
for (int i = 0; i < (bufferLength * 2); i += 2) {
    pointBuffer[i] = 1.0;       //X
    pointBuffer[i + 1] = 2.0;   //Y
}

id<MTLBuffer> pointDataBuffer = [device newBufferWithBytes:&pointBuffer length:sizeof(pointBuffer) options:MTLResourceOptionCPUCacheModeDefault];

//Populate array with updated test values       
for (int i = 0; i < (bufferLength * 2); i += 2) {
    pointBuffer[i] = 3.0;       //X
    pointBuffer[i + 1] = 4.0;   //Y
}

//In the (Swift) class with the pipeline:
commandEncoder!.setBuffer(pointDataBuffer, offset: 0, index: 4)

根据文档,我似乎需要调用 didModifyRange:pointDataBuffer 似乎无法识别选择器。

有没有一种方法可以更新数组而无需重新创建 MTLBuffer?

最佳答案

-newBufferWithBytes:... 复制传入的字节。它不会继续引用它们。因此,对 pointBuffer 的后续更改不会影响它。

但是,像这样的缓冲区(其存储模式不是私有(private)的)通过 -contents 方法提供对其存储的访问。所以,你可以这样做:

float *points = pointDataBuffer.contents;
for (int i = 0; i < (bufferLength * 2); i += 2) {
    points[i] = 3.0;       //X
    points[i + 1] = 4.0;   //Y
}

不过要小心。 CPU 和 GPU 彼此异步运行。如果 GPU 可能正在处理引用缓冲区的命令,则从 CPU 修改它可能会干扰这些命令的操作。因此,您需要采取措施同步对缓冲区的访问,或者避免同时进行 CPU 和 GPU 访问。

关于ios - 创建后更改 MTLBuffer 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47048304/

相关文章:

php - php输出缓冲区如何工作(使用$_SERVER ['REQUEST_TIME']计算脚本执行时间的问题)

node.js - Node.js 中缓冲区的使用案例

ios - for循环中的多个内核调用

ios - 是否有快速绘制二维数组的推荐方法?

ios - 您的二进制文件中不存在应用内购买功能

ios - 用日语开发应用程序,添加本地化到英语

ios - XCode:如何通过 UUID 连接到 BLE 外设?

node.js - NodeJS 缓冲区 - 读取小端缓冲区

swift - 从 MTKView 创建的 UIImage 导致颜色/不透明度差异

ios - 快速的 Alamofire POST 请求