MTKView的提交调用错误后提供的调度程序处理程序

问题描述

我是Metal的新手。

在这里,我一直尝试使用MTKView显示图像,并且在第一次加载时效果很好。但是,如果再次调用draw(in view: MTKView),则应用程序将崩溃,并产生以下错误Scheduler handler provided after commit call

我需要知道:

  • 致电draw(in view: MTKView)
  • completionHandlerscheduledHandler用于什么
  • 如何消除错误

这是我尝试过的:

override func viewDidLoad() {
    super.viewDidLoad()
    configureMetal()
    contentView.delegate = self //Where contentView: MTKView
}

fileprivate func configureMetal() {
    guard let __device = MTLCreateSystemDefaultDevice() else { fatalError() }
    contentView.enableSetNeedsdisplay = true
    contentView.device = __device
    _device = contentView.device
    contentView.clearColor = MTLClearColor(red: 0,green: 0,blue: 0,alpha: 0.3)
    mtkView(contentView,drawableSizeWillChange: contentView.drawableSize)
        
    guard let __commandQueue = _device.makeCommandQueue() else { fatalError() }
    _commandQueue = __commandQueue
    guard let __commandBuffer = _commandQueue.makeCommandBuffer() else { fatalError() }
    _commandBuffer = __commandBuffer
    context = CIContext(mtlDevice: _device)
}

func draw(in view: MTKView) {
    view.framebufferOnly = false
    guard let renderPassDescriptor = view.currentRenderPassDescriptor else { return }
    let commandEncoder = _commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor)
    commandEncoder?.endEncoding()
    guard let drawable = view.currentDrawable else { return }
    let drawableSize = view.drawableSize
        
    // optional: scale the image to fit the view
    let scaleX = drawableSize.width / targetCIImage.extent.width
    let scaleY = drawableSize.height / targetCIImage.extent.height
    let scale = min(scaleX,scaleY)
    let scaledImage = targetCIImage.transformed(by: CGAffineTransform(scaleX: scale,y: scale))

    // optional: center in the view
    let originX = max(drawableSize.width - scaledImage.extent.size.width,0) / 2
    let originY = max(drawableSize.height - scaledImage.extent.size.height,0) / 2
    let centeredImage = scaledImage.transformed(by: CGAffineTransform(translationX: originX,y: originY))
        
    referenceCIImage = centeredImage
        
    shapeDrawableSize = CGSize(width: centeredImage.extent.width * scale,height: centeredImage.extent.height * scale)
        
    let destination = CIRenderDestination(width: Int(drawableSize.width),height: Int(drawableSize.height),pixelFormat: view.colorPixelFormat,commandBuffer: _commandBuffer) { () -> MTLTexture in
                                            drawable.texture
    }
    let task = try? context.startTask(toRender: centeredImage,to: destination)
        
    _commandBuffer.present(drawable)
    _commandBuffer.addScheduledHandler { _ in
        print("Scheduled completion")
    }
    _commandBuffer.addCompletedHandler { _ in
        print("completion")
    }
    _commandBuffer.commit()
        
    dispatchQueue.global(qos: .background).async {
        let _ = try? task?.waitUntilCompleted()
    }
}

func mtkView(_ view: MTKView,drawableSizeWillChange size: CGSize) {}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)