金属 newBufferWithBytes 用法

Metal newBufferWithBytes usage

我有一个关于分配新 Metal 设备缓冲区的基本问题。我看到的大多数示例代码在设置时创建 MTLBuffer 并且不修改它。但我想知道顶点数据是否在每次渲染调用时都在变化,每次创建一个新的 MTLBuffer(使用 -[MTLBuffer newBufferWithBytes:length:option])是否可以将数据发送到 GPU 上的着色器 运行,或者,给定大小的 MTLBuffer 是否应该被创建一次,但它的字节数在每次渲染调用时都被修改了?根据最佳实践推荐的方法是什么?

如果是少量数据(4K以下)相信可以使用setVertexBytes()和setFragmentBytes(): https://developer.apple.com/documentation/metal/mtlrendercommandencoder/1515846-setvertexbytes

对于每帧都会更改的大量数据,他们建议您使用 triple-buffered 方法,这样连续帧对缓冲区的访问就不会受到干扰: https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/TripleBuffering.html

本教程展示了如何设置三重缓冲: https://www.raywenderlich.com/146418/metal-tutorial-swift-3-part-3-adding-texture

这实际上类似于教程的第三部分,但它是显示 triple-buffering 设置的部分,位于 "Reusing Uniform Buffers" 下。

我不确定的是 better/faster 是否也对少量数据使用 triple-buffering - 他们在那个教程中只对几个矩阵这样做,所以也许最好总是三重缓冲。