【问题标题】:Metal newBufferWithBytes usageMetal newBufferWithBytes 用法
【发布时间】:2018-04-05 19:50:42
【问题描述】:

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

【问题讨论】:

    标签: ios metal metalkit mtlbuffer


    【解决方案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

    这实际上类似于教程的第三部分,但它是在“重用统一缓冲区”下显示三重缓冲设置的部分。

    我不确定的是,在少量数据上使用三重缓冲是否更好/更快——他们在该教程中只针对几个矩阵使用了三重缓冲,所以也许总是三重缓冲更好缓冲区。

    【讨论】:

    • 感谢您的回答。传递顶点数组很简单。如何使用相同的方法通过 setFragmentBytes 传递结构?
    • 你也可以这样做——传递结构的地址:renderEncoder.setFragmentBytes(&myStruct, length: MemoryLayout.stride, index: uniforms_index)
    • 发送顶点时崩溃,“断言失败‘字节在索引 0 处被绑定到启用写访问的着色器参数。’”
    • 将buffer参数的地址空间改为constant而不是device。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2020-06-12
    • 2018-04-16
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多