我在应用程序中有不同类型的绘图。例如,我绘制形状和网格。
对于每种类型的图形,我都有一个自定义的顶点和片段着色器以及一个从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?
答案 0 :(得分:0)
您应该重新使用命令队列。除特殊情况外,每个设备通常只有一个命令队列。
无需重复使用管道描述符对象。这些创建起来很便宜并且打算是短暂的。 (管道 state 对象的创建成本很高,应该像创建对象一样创建一次并重复使用。)
请参阅《金属编程指南》的Transient and Non-transient Objects in Metal section。