当尝试在Metal和Core Image的帮助下将简单的小插图滤镜应用于iPhone6的原始摄像头馈送时,我发现MTKView
中要处理和渲染的帧之间存在很多滞后/ p>
我遵循的方法是(MetalViewController.swift):
AVCaptureVideoDataOutputSampleBufferDelegate
CMSampleBuffer
> CVPixelBuffer
> CGImage
MTLTexture
创建一个CGImage
。 点号2和3在名为fillMTLTextureToStoreTheImageData
CIFilter
应用于从CIImage
的{{1}}获取的MTLTexture
MTKViewDelegate
我想念什么吗?
答案 0 :(得分:3)
您的步骤2太慢了,无法支持实时渲染...,看来您缺少了几个步骤。为了您的目的,通常可以:
设置:
CVPixelBuffer
的池-使用CVPixelBufferPoolCreate
CVMetalTextureCacheCreate
创建金属纹理池对于每帧:
CMSampleBuffer
> CVPixelBuffer
> CIImage
CIImage
通过过滤器管道CVPixelBuffer
中CVMetalTextureCacheCreateTextureFromImage
通过过滤的CVPixelBuffer创建金属质感如果设置正确,所有这些步骤将确保您的图像数据保留在GPU上,而不是从GPU传输到CPU再返回GPU进行显示。
好消息是,所有这些都在Apple https://developer.apple.com/library/archive/samplecode/AVCamPhotoFilter/Introduction/Intro.html#//apple_ref/doc/uid/TP40017556的AVCamPhotoFilter示例代码中进行了演示。特别是请参见RosyCIRenderer
类及其超类FilterRenderer
。