Как убрать лаги при рендеринге в 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()
            }
        }
    }

Ответы (0 шт):