如何“预填充”GPUImage过滤器以加快加载速度

时间:2014-05-09 05:17:59

标签: ios uiimage gpuimage

我目前正在使用三个GPUImage提供的过滤器(Amatorka,Miss Etikate和Soft Elegance),理想情况下,用户可以在拍摄后尽快将过滤器应用到照片中(例如,用户可以立即在照片上向左或向右滑动以查看应用过滤器后照片的外观。

我目前的问题是,从开始到结束,三个过滤器需要大约1.5秒才能完成处理(在iPhone 5上)。我试图通过将过滤器存储为strong属性并在viewDidLoad中实例化来加快过程,但所有这些结果都是内存警告并且应用程序崩溃。我想知道是否有一个很好的解决方法是使用拍摄的图像“预先填充”过滤器,以便可以快速应用它们而不必等待,或者如果这不是它的意思。

非常感谢帮助。我粘贴了一个示例方法,我使用了Amatorka过滤器的过程:

- (void)processAmatorkaFilter
{
    dispatch_queue_t backgroundQueue = dispatch_queue_create("queue1", 0);

    dispatch_async(backgroundQueue, ^{
        //do filter work
        UIImage *imageShown = self.totalOriginalImage;
        GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:imageShown];
        GPUImageAmatorkaFilter *amoFilter = [[GPUImageAmatorkaFilter alloc] init];

        [stillImageSource addTarget:amoFilter];
        [amoFilter useNextFrameForImageCapture];
        [stillImageSource processImage];

        UIImage *currentFilteredVideoFrame = [amoFilter imageFromCurrentFramebuffer];
        UIImage *revampedImage = [self orientationAdjustment:currentFilteredVideoFrame];

        if (isFrontFacing){
            revampedImage = [UIImage imageWithCGImage:revampedImage.CGImage scale:revampedImage.scale orientation:UIImageOrientationLeftMirrored];
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.filteredImageArray addObject:revampedImage];
            NSLog(@"\n\nDone Amatorka\n\n");
        });
    });
}

这就是我允许应用过滤器的方法:

- (void)handleLeftSwipe:(UIGestureRecognizer*)recognizer {
    NSLog(@"Swiped left");

    if (rotatingNumber == 3){ //3 filters and 1 original image in total
        rotatingNumber = 0;
    } else {
        rotatingNumber++;
    }

    UIImage *swipedImage = [self.filteredImageArray objectAtIndex:rotatingNumber];
    self.imageView.image = swipedImage;

}

1 个答案:

答案 0 :(得分:3)

Amatorka,Miss Etikate和Soft Elegance过滤器都是GPUImageLookupFilter的子类。子类查找过滤器与其他过滤器略有不同,因为它们使用GPUImagePicture的内部实例来引入用于这些过滤器的查找表。在这样的查找的第一次实例化中,初始化和上载这些查找图像可能需要更长的时间。

一种可以加速此过程而不必依赖于过滤器的方法(尽管您应该能够在没有使用我最新的缓存帧缓冲区优化的描述的内存后果的情况下执行此操作)是手动复制这些查找。

如果您查看这些查找过滤器子类,您将看到它们用于查找的图像(" lookup_miss_etikate.png"等)。从每个图像中手动创建一个GPUImagePicture实例并保持不变。当您需要创建特定类型的查找过滤器时,只需在查找过滤器的第二个输入位置添加查找图像:

[lookupImage addTarget:lookupFilter atTextureLocation:1];

您将重新创建该特定的查找过滤器子类。它的行为就像子类一样,只是每次都要避免创建和上传查找图像。

完成后,删除查找过滤器作为查找图像的目标,并根据需要处理过滤器。