Пытаясь применить простой фильтр виньетирования к исходному каналу камеры iPhone6 с помощью Metal и Core Image, я вижу большое отставание между кадрами, обрабатываемыми и отображаемыми в MTKView
Подход, которым я придерживался, (MetalViewController.swift):
- Получить необработанный вывод с камеры, используя
AVCaptureVideoDataOutputSampleBufferDelegate
- Преобразование
CMSampleBuffer
> CVPixelBuffer
> CGImage
- Создайте
MTLTexture
с этим CGImage
.
Точка №.2 и 3 находятся внутри метода с именем: fillMTLTextureToStoreTheImageData
Применение
CIFilter
к
CIImage
, полученному из
MTLTexture
в
MTKViewDelegate
func draw(in view: MTKView) {
if let currentDrawable = view.currentDrawable {
let commandBuffer = self.commandQueue.makeCommandBuffer()
if let myTexture = self.sourceTexture{
let inputImage = CIImage(mtlTexture: myTexture, options: nil)
self.vignetteEffect.setValue(inputImage, forKey: kCIInputImageKey)
self.coreImageContext.render(self.vignetteEffect.outputImage!, to: currentDrawable.texture, commandBuffer: commandBuffer, bounds: inputImage!.extent, colorSpace: self.colorSpace)
commandBuffer?.present(currentDrawable)
commandBuffer?.commit()
}
}
}
Производительность совсем не та, что Apple упоминала в этом документе: https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101
Я что-то упустил?