问题描述
我是Metal的新手。
在这里,我一直尝试使用MTKView显示图像,并且在第一次加载时效果很好。但是,如果再次调用draw(in view: MTKView)
,则应用程序将崩溃,并产生以下错误:Scheduler handler provided after commit call
。
我需要知道:
- 致电
draw(in view: MTKView)
时 -
completionHandler
和scheduledHandler
用于什么 - 如何消除错误
这是我尝试过的:
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 (将#修改为@)