2011-12-10 2 views
3

마침내 CoreImage를 사용하여 이미지를 렌더링하는 그래픽 라이브러리 (두 이미지를 혼합하는 것과 같은)를 변환하고 느린 (iOS5.01 iPhone 4S)으로 작동하도록했습니다. 내가 CoreImage에의 약속은 하드웨어 가속 알았는데, 여기에 내가 뭘하는지입니다 :CoreImage, iOS5 및 속도, CoreImage의 속도가 느린 이유는 무엇입니까?

그것은 작동
 CIImage *intputBackgroundImage = [[CIImage alloc] initWithCGImage:backgroundImageRef]; 
    CIImage *inputImage = [[CIImage alloc] initWithCGImage:inputImageRef]; 

    CIFilter *multiply = [CIFilter filterWithName:@"CIMultiplyBlendMode"]; 
    [multiply setDefaults]; 

    [multiply setValue:intputBackgroundImage forKey:@"inputBackgroundImage"]; 
    [multiply setValue:inputImage forKey:@"inputImage"]; 

    CIImage *result = multiply.outputImage; 
    CIContext *ctx = [CIContext contextWithOptions:nil]; 

    CGImageRef resultRef = [ctx createCGImage:result fromRect:CGRectMake(0, 0, imgFrame.size.width, imgFrame.size.height)]; 
    UIImage *resultImage = [UIImage imageWithCGImage:resultRef]; 
    CGImageRelease(resultRef); 

, 나는 inputImage이 backgroundImage의에 혼합 한 이미지를 얻을 수 있지만, 실제로는 더 이상 내가 가진 경우보다 오래 걸리는 단지 CoreGraphics와 CGContext()를 사용하여 완성했다. 이 작업이 GPU에서 수행되고 있지 않은지 확인하는 방법이 있습니까? 그렇지 않은 이유가 있습니까?

감사합니다, 당신은 다시 쓰게 필요

+1

Instruments에서이 코드를 프로파일 링했을 때 무엇을 발견 했습니까? –

+1

나는 그것을 시도 할 것이다 @ PeterHosey. 내가 GPU/VRAM을 들락날락하고 있기 때문에 좀 더 주위를 읽은 후에 나는 그것을 의심하기 시작했습니다. 즉, 데이터가 GPU/VRAM에 복사되고 작업이 완료되면 다시 RAM으로 복사 (UIImage) 한 다음 VRAM으로 다시 복사합니다 (UIImage 표시). – Shizam

+2

@Shizam - GPU 로의 업로드는 꽤 빠르며, GPU에서 정보를 가져 오는'glReadPixels()'호출조차도 10 밀리 초 정도 iPhone 4의 적당한 크기의 이미지에 대해 수행 할 수 있습니다. CPU보다 GPU에서 훨씬 빨라 졌으므로 어딘가에 숨겨진 오버 헤드가 있어야합니다. 아마 Core Image 내의 어딘가에서 (아마도 CGImageRef로 또는 CGImageRef로부터) 포맷 변환이 이루어질 것입니다. Peter가 말했듯이, Time Profiler는 병목 현상이있는 곳을 찾아 낼 수도 있습니다. –

답변

1

상황이 CI에 가장 적합합니다, 또는 여러 개의 필터를해야 할 일.

항목이 CPU 메모리에서 GPU 메모리로 복사되어야하기 때문에 속도가 더 빠릅니다 (iOS에서 OpenGL 통합 메모리 지원 없음).

이것은 하나의 효과 만 수행하기 때문에 이중 복사로 인해 시간이 더 걸릴 것임을 의미합니다.

+0

이것이 내 문제의 핵심이라고 생각하며 'CAEAGLLayers'를 사용하는 방법을 알아야합니다. – Shizam

관련 문제