我有:
主GPUImage预览窗口 GPUImage直方图坐在单独的GPUImageView上。
//Adding main preview
self.previewView = [[GPUImageView alloc] init];
self.previewView.backgroundColor = [UIColor blackColor];
self.previewView.frame = CGRectMake(0, 0, 414, 552);
[self.view addSubview:self.previewView];
[self.stillCamera addTarget:self.previewView];
//Adding Histogram
self.histogramContainerView = [[GPUImageView alloc] init];
self.previewView.frame = CGRectMake(0, 0, 414, 200);
self.previewView.backgroundColor = [UIColor clearColor];
[self.view addSubview:self.histogramContainerView];
self.histFilter = [[GPUImageHistogramFilter alloc] initWithHistogramType:4];
sellf.histGenerator = [[GPUImageHistogramGenerator alloc] init];
[self.histGenerator forceProcessingAtSize:histogramContainerView.sizeInPixels];
[self.stillCamera addTarget:self.histFilter];
[self.histFilter addTarget:self.histGenerator];
[self.histGenerator addTarget:self.histogramContainerView];
上方显示主预览窗口内小容器中的直方图。直方图看起来很好。
问题:直方图出现后,主预览窗口开始大幅下降帧。这是在iP6 +上。当我在这里询问如何使用多线程(GCD)和GPUImage时,我被建议远离那个。
如何解决丢帧问题?有没有办法将Histogram任务安全地发送到不同的线程?
答案 0 :(得分:1)
GPUImageHistogramFilter在GPU上使用分散/聚集操作进行操作。所有GPU绑定的处理操作都已经在后台线程上运行,并且需要协调它们的活动,所以在线程方面没有任何可以做的事情来改进它。
直方图操作的速度取决于它必须处理的点数。 downsamplingFactor
属性仅导致图像的一小部分被处理。默认情况下,这是图像的1/16,但即使这样也可能被大图像重载。
您可以在直方图之前使用虚拟滤镜,并在其上设置-forceProcessingAtSize:
以重新缩放进入直方图的图像。这可以显着减少直方图滤波器等滤波器的处理时间。
最后,我应该注意,如果你的stillCamera实例是GPUImageStillCamera,你认为丢帧的实际上可能只是相机捕捉预览的速度。从静态相机中抓取视频供稿作为预览不同于从相机实例获取相框。相机预览仍然会以低于15 FPS的速度进行更新,因此您可能会误以为过滤器会降低速度。