2014-11-26 1 views
0

GPUImageAlphaBlendFilter을 사용하면 UI의 슬라이더를 사용하여 의 조합을으로 변경할 수 있습니다. 그것은 위대한 작품, 나는 앞뒤로 빠르게 주위에 슬라이더를 이동할 수 있지만 너무 자주 슬라이딩하거나 몇 초 동안 주위에 미끄러지는 경우 종종이 오류를 줄 것이다 :GPUImage - 너무 자주 블렌딩 할 때 프레임 버퍼를 과도하게 사용하려고 시도했습니다

uncaught exception 'NSInternalInconsistencyException', 이유 : '프레임 버퍼를 과도하게 사용하려고 시도했습니다. -imageFromCurrentFramebuffer를 사용하기 전에 -useNextFrameForImageCapture를 호출하는 것을 잊었습니까?

그것은 GPUImage/프레임 워크/소스에 잠금 해제 기능에서오고

/GPUImageFramebuffer.m : imageByFilteringImage 이미이 알아서하기 때문에 브래드 라슨의 Framebuffer Article, useNextFrameForImageCapture가 명시 적으로 필요하지 않습니다에 따르면 269

. 그러나 어떻게 든 프레임 버퍼가 동기화되지 않고 있습니다. 아마도 빠른 업데이트 요청을 따라갈 수 없기 때문일 것입니다.

제가 제대로하고 있지 않은 것이 있는지 궁금합니다. 어떤 아이디어? 아래

코드는 기본적으로하고있다 : 슬라이더가 이동함에 따라
1. 먼저 applyAndGetCIImage는 슬라이더라고, 모든 설정을
2를 얻기 위해 설정 필터를 호출.

public class StylePhotoFilter: PhotoFilter { 
    var blendFilter: GPUImageAlphaBlendFilter! 
    var originalImage: UIImage! 
    var styledImage: UIImage! 
    var styledImageSource: GPUImagePicture! 

    override func setupFilter() { 

    // setup the filters 
    blendFilter = GPUImageAlphaBlendFilter() 

    // setting up the image to edit 
    if(uiImage == nil) { 
     let context = CIContextManager.sharedInstance 
     let cgiImgRef = context.createCGImage(inputImage, fromRect: inputImage.extent()) 
     originalImage = UIImage(CGImage: cgiImgRef) 
    } else { 
     originalImage = uiImage! 
    } 

    // apply the style fully 
    // styledImage = // I created this image earlier, we can assume it works 

    // add target photo 
    styledImageSource = GPUImagePicture(image: styledImage) 
    styledImageSource.addTarget(blendFilter, atTextureLocation: 0) 

    } 

    public override func applyAndGetCIImage(sliderVal: Float) -> CIImage! { 
    // set the mix 
    blendFilter.mix = sliderVal 

    // blend it 
    // blendFilter.useNextFrameForImageCapture() // According to Brad Larson, this is no longer needed, as imageByFilteringImage does this for you 
    styledImageSource.processImage() 
    let blendedImage = blendFilter.imageByFilteringImage(originalImage) 

    return CIImage(image: blendedImage) 

    } 
} 

답변

2

방법 useNextFrameForImageCapture은 필터링에는 적용해야하지만 그림에는 적용되지 않아야합니다.

blendFilter = GPUImageAlphaBlendFilter() 
blendFilter.useNextFrameForImageCapture() 
+0

흥미 롭군요. 그래서 나는 그것도 시도했지만 여전히 같은 오류입니다. 이것은 잠시 동안 작동하지만 슬라이더를 많이 움직일 때만 오류가 발생합니다. – kineticac

+0

슬라이더를 움직이지 않으면 제대로 작동합니까? –

+0

슬라이더를 움직이면 제대로 작동합니다. 내가 그것을 정말로 빨리 몇 초 동안 움직이 자마자 그것은 부서집니다. 거의 스레드 안전하지 않습니다. – kineticac

0

이 방법이 도움이 될지 잘 모르겠지만 그 문제도보고 있었고이 코드를 기본 루프에 추가하여 수정했습니다. 참조 횟수에 문제가있는 것으로 보입니다.

GPUImageFramebuffer* fb = self.filter.framebufferForOutput; 
[fb disableReferenceCounting]; 
관련 문제