我有一个关于分配新的Metal设备缓冲区的基本问题 . 我看到的大多数示例代码在设置时创建MTLBuffer而不进行修改 . 但我想知道顶点数据是否在每次渲染调用时都在变化,是否可以每次创建一个新的MTLBuffer(使用 - [MTLBuffer newBufferWithBytes:length:option])将数据发送到在GPU上运行的着色器,或者,应该是MTLBuffer给定大小创建一次,但每次渲染调用都修改了字节数?根据最佳做法,推荐的方式是什么?
如果是少量数据(4K以下),我相信你可以使用setVertexBytes()和setFragmentBytes():https://developer.apple.com/documentation/metal/mtlrendercommandencoder/1515846-setvertexbytes
对于每帧都会更改的大量数据,他们建议您使用三重缓冲方法,以便连续帧对缓冲区的访问不会产生干扰: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
这实际上就像教程的第三部分,但它是显示三重缓冲设置的部分,在“重用统一缓冲区”下 .
我不确定的是,对于少量数据使用三重缓冲是否更好/更快 - 他们只在几个矩阵的教程中这样做,所以最好总是三倍缓冲 .
1 回答
如果是少量数据(4K以下),我相信你可以使用setVertexBytes()和setFragmentBytes():https://developer.apple.com/documentation/metal/mtlrendercommandencoder/1515846-setvertexbytes
对于每帧都会更改的大量数据,他们建议您使用三重缓冲方法,以便连续帧对缓冲区的访问不会产生干扰: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
这实际上就像教程的第三部分,但它是显示三重缓冲设置的部分,在“重用统一缓冲区”下 .
我不确定的是,对于少量数据使用三重缓冲是否更好/更快 - 他们只在几个矩阵的教程中这样做,所以最好总是三倍缓冲 .