金属的正确使用方法

时间:2019-05-31 19:50:53

标签: ios swift metal

我在应用程序中有不同类型的绘图。例如,我绘制形状和网格。

对于每种类型的图形,我都有一个自定义的顶点和片段着色器以及一个从MTKViewDelegate继承的类。这些类中的每一个都处理计算输入所需的处理,以及一个看起来像这样并在init上调用的方法:

private func loadMetal(_ mtkView: MTKView) {
    mtkView.colorPixelFormat = .bgra8Unorm_srgb

    let defaultLibrary = device.makeDefaultLibrary()!
    let vertexProgram = defaultLibrary.makeFunction(name: "grid_vertex")
    let fragmentProgram = defaultLibrary.makeFunction(name: "grid_fragment")

    let pipelineStateDescriptor = MTLRenderPipelineDescriptor()
    pipelineStateDescriptor.vertexFunction = vertexProgram
    pipelineStateDescriptor.fragmentFunction = fragmentProgram
    pipelineStateDescriptor.colorAttachments[0].pixelFormat = mtkView.colorPixelFormat

    pipelineState = try! device.makeRenderPipelineState(descriptor: pipelineStateDescriptor)

    commandQueue = device.makeCommandQueue()

    vertexBuffer = device.makeBuffer(length: bufferCapacity * MemoryLayout<GridVertex>.stride, options: [])

    vertexIndices = device.makeBuffer(length: bufferCapacity * MemoryLayout<UInt16>.size,
                                      options: [])
}

因此,对于每对顶点/片段着色器,我都在创建pipelineDescriptor和commandQueue。可以,但是我想知道是否可以,还是应该重用commandQueue / pipeline?

1 个答案:

答案 0 :(得分:0)

您应该重新使用命令队列。除特殊情况外,每个设备通常只有一个命令队列。

无需重复使用管道描述符对象。这些创建起来很便宜并且打算是短暂的。 (管道 state 对象的创建成本很高,应该像创建对象一样创建一次并重复使用。)

请参阅《金属编程指南》的Transient and Non-transient Objects in Metal section