我有:
主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/