我有一个关于分配新金属设备缓冲区的基本问题。我看到的大多数示例代码在设置时创建 MTLBuffer 并且不修改它。但我想知道顶点数据是否在每次渲染调用时都在变化,是否可以每次创建一个新的 MTLBuffer(使用 -[MTLBuffer newBufferWithBytes:length:option])来将数据发送到在 GPU 上运行的着色器,或者,应该 MTLBuffer给定大小创建一次,但每次渲染调用都会修改字节?根据最佳实践,推荐的方法是什么?
问问题
1092 次
1 回答
3
如果是少量数据(4K以下)相信可以使用setVertexBytes()和setFragmentBytes(): https ://developer.apple.com/documentation/metal/mtlrendercommandencoder/1515846-setvertexbytes
对于每帧都更改的大量数据,他们建议您使用三重缓冲方法,以便连续帧对缓冲区的访问不会干扰: https ://developer.apple.com/library/content/documentation/3DDrawing /概念/MTLBestPracticesGuide/TripleBuffering.html
本教程展示了如何设置三重缓冲: https ://www.raywenderlich.com/146418/metal-tutorial-swift-3-part-3-adding-texture
这实际上就像教程的第三部分,但它是在“重用统一缓冲区”下显示三重缓冲设置的部分。
我不确定的是,在少量数据上使用三重缓冲是否更好/更快——他们在该教程中只为几个矩阵这样做,所以也许总是三重缓冲更好。
于 2018-04-05T20:00:46.193 回答