Как убрать лаги при рендеринге в mtkView?
Я делаю функционал для использование фильтров(CIFilter) с помощью ползунков, рендерю получившееся изображение с использованием MTKView, проблема в том, что в самом начале движения ползунка возникают пролагивания на секунду, после чего пропадают. С чем это может быть связано и как это возможно решить?
Настройка mtkView
private func setupMetal(){
metalDevice = MTLCreateSystemDefaultDevice()
mtkView.device = metalDevice
mtkView.isOpaque = false
mtkView.isPaused = true
mtkView.enableSetNeedsDisplay = true
metalCommandQueue = metalDevice.makeCommandQueue()
mtkView.delegate = self
mtkView.framebufferOnly = false
}
Функция draw
public func draw(in view: MTKView) {
if let currentDrawable = view.currentDrawable,
let commandBuffer = metalCommandQueue.makeCommandBuffer() {
let drawableSize = view.drawableSize
guard let ciImage = currentCIImage else {
return
}
let scaleX = drawableSize.width / ciImage.extent.width
let scaleY = drawableSize.height / ciImage.extent.height
let scale = min(scaleX, scaleY)
let scaledImage = ciImage.transformed(by: CGAffineTransform(scaleX: scale, y: scale))
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))
let destination = CIRenderDestination(width: Int(drawableSize.width),
height: Int(drawableSize.height),
pixelFormat: view.colorPixelFormat,
commandBuffer: commandBuffer,
mtlTextureProvider: { () -> MTLTexture in
return currentDrawable.texture
})
let task = try! self.ciContext.startTask(toRender: centeredImage, to: destination)
commandBuffer.present(currentDrawable)
commandBuffer.commit()
DispatchQueue.global(qos: .background).async {
let info = try! task.waitUntilCompleted()
}
}
}