2014-05-09 1 views
1

현재 제공된 GPUImage 필터 중 3 개 (Amatorka, Etikate 및 Soft Elegance) 중 3 개를 사용하고 있으며 사용자가 필터를 적용 할 수있는 것이 가장 이상적입니다. (예 : 사용자가 필터를 적용한 상태에서 사진의 모습을 보려면 왼쪽 또는 오른쪽으로 사진을 스 와이프 할 수 있습니다.)빠른로드 시간을 위해 GPUImage 필터를 "미리 채우는 방법"

현재 문제는 처음부터 끝까지 3 개의 필터가 처리를 완료하기 위해 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; 

} 

답변

3

Amatorka, 미스 Etikate 및 소프트 우아함 필터는 GPUImageLookupFilter의 모든 하위 클래스입니다. 서브 클래 싱 된 검색 필터는 GPUImagePicture의 내부 인스턴스를 사용하여 해당 필터에 사용 된 조회 테이블을 가져 오므로 다른 필터와 약간 다릅니다. 이러한 룩업 이미지의 초기화 및 업로드는 이와 같은 룩업의 첫 번째 인스턴스 생성에 약간 시간이 걸릴 수 있습니다.

필터를 사용하지 않고도이 프로세스를 가속화 할 수있는 방법 중 하나는 (내가 최근에 캐시 된 프레임 버퍼 최적화를 사용하여 설명하는 메모리 결과없이 수행 할 수 있어야하지만) 이러한 조회를 수동으로 복제하는 것입니다.

룩업 필터 하위 클래스를 보면 룩업에 사용하는 이미지 ("lookup_miss_etikate.png"등)가 표시됩니다. 각 이미지에서 GPUImagePicture 인스턴스를 수동으로 만들고 그 이미지를 고정합니다. 특정 유형의 검색 필터를 작성해야하는 경우, 단순히 조회 필터의 두 번째 입력 위치에서 검색 이미지를 추가 :

[lookupImage addTarget:lookupFilter atTextureLocation:1]; 

당신은 특정 조회 필터 서브 클래스를 다시 것입니다. 서브 클래스와 마찬가지로 동작 할 것이고, 매번 조회 이미지를 생성하고 업로드 할 필요가 없습니다.

완료되면 조회 이미지의 대상으로 조회 필터를 제거하고 필요에 따라 필터를 삭제하십시오.

+0

이것은 훌륭한 조언입니다 - 감사합니다! – daspianist

+0

@BradLarson 안녕하세요, 나는이 세 가지 필터 (Amatorka, Etikate Miss 및 Soft Elegance)를 하나의 사전 녹화 된 영화에 추가해야합니다. 추가 중이지만 동영상 속도가 느립니다. 비디오 용 필터를 빠르게 할 수있는 방법이 있습니까? – Bhushan

+0

@Bhushan - 세 가지 패스 모두를 통해 전송 된 내용에 대해 올바른 조회를 사용하는 단일 조회 필터로 결합 해보십시오. –

관련 문제