gpt4 book ai didi

ios - 在iOS中使用Metal渲染时,每帧更新索引缓冲区

转载 作者:行者123 更新时间:2023-12-01 18:35:49 27 4
gpt4 key购买 nike

我有非常动态的数据,每帧都会改变。数据本身相对较小,所以我使用
[commandEncoder setVertexBytes:_vertices.buffer() length:_vertices.size() * sizeof(float) atIndex:0];

设置顶点数据。

但是,在使用以下图形绘制时,我还需要设置索引数据:
[commandEncoder drawIndexedPrimitives: ...];
如何通过MTLBuffer方法更新提供的用于索引数据的drawIndexedPrimitives?我需要能够有效地更新索引缓冲区。

最佳答案

This article包含有关使用多个缓冲区在CPU和GPU之间同步数据而不会强制它们以同步方式工作的深入说明。您应该仔细阅读。我将在下面总结该方法。

  • 选择索引缓冲区的大小,该大小应足以容纳您可能需要绘制的最大索引数。
  • 分配此大小的几个(2-3)缓冲区,并将它们放置在数组中(类型为NSArray<id<MTLBuffer>>)。这是您的重用池;我在下面将其称为indexBufferPool
  • 初始化渲染器create a dispatch semaphore时,其值等于您放入重用池中的缓冲区数。我在下面将其称为bufferSemaphore
  • 创建一个缓冲区索引成员变量并将其初始化为0。我在下面将其称为bufferIndex
  • 每次绘制时,请通过调用dispatch_semaphore_wait(bufferSemaphore, DISPATCH_TIME_FOREVER)等待信号量。
  • 当信号量等待函数返回时,将新索引数据复制到当前缓冲区索引处的缓冲区中是安全的。使用memcpy或其他复制技术,将索引数据复制到bufferPool[bufferIndex]的内容中。
  • 使用bufferPool[bufferIndex]作为索引缓冲区绘制图元。
  • 通过设置bufferIndex来增加bufferIndex = (bufferIndex + 1) % ResourceCount,其中ResourceCount是重用池中的缓冲区数。
  • 提交之前,将完成的处理程序添加到当前命令缓冲区中。完成的处理程序应调用dispatch_semaphore_signal(bufferSemaphore)。这样可以使对draw方法的所有未决调用知道在当前缓冲区索引处写入缓冲区是安全的。
  • 关于ios - 在iOS中使用Metal渲染时,每帧更新索引缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59503060/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com