我有:

主GPUImage预览窗口
坐在单独的GPUImageView上的GPUImage直方图。

//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 +上。当我问到这里要在GPUImage上使用多线程(GCD)时,建议我不要这样做。

如何解决丢帧问题?有没有一种方法可以安全地将直方图任务分派到其他线程?

最佳答案

GPUImageHistogramFilter在GPU上使用分散/聚集操作进行操作。所有与GPU绑定的处理操作已经在后台线程上运行,并且需要协调其活动,因此就线程而言,没有任何措施可以改善此情况。

直方图运算的速度取决于它必须处理的点数。 downsamplingFactor属性仅导致图像的一小部分被处理。默认情况下,这是图像的1/16,但是即使是大图像也可能使图像超载。

您可以在直方图之前使用虚拟滤镜,并在其上设置-forceProcessingAtSize:以重新缩放进入直方图的图像。这可以显着减少直方图过滤器等过滤器的处理时间。

最后,我应该注意,如果您的stillCamera实例是GPUImageStillCamera,那么您认为丢失的帧实际上可能只是相机捕获预览的速度。从静态相机获取视频供稿作为预览与从视频相机实例获取帧不同。静态相机预览的更新速度往往低于15 FPS,因此您可能会误以为滤镜会减慢速度。

关于ios - GPUImage直方图和丢帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30578457/

10-14 05:07