마침내 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에서 수행되고 있지 않은지 확인하는 방법이 있습니까? 그렇지 않은 이유가 있습니까?
감사합니다, 당신은 다시 쓰게 필요
Instruments에서이 코드를 프로파일 링했을 때 무엇을 발견 했습니까? –
나는 그것을 시도 할 것이다 @ PeterHosey. 내가 GPU/VRAM을 들락날락하고 있기 때문에 좀 더 주위를 읽은 후에 나는 그것을 의심하기 시작했습니다. 즉, 데이터가 GPU/VRAM에 복사되고 작업이 완료되면 다시 RAM으로 복사 (UIImage) 한 다음 VRAM으로 다시 복사합니다 (UIImage 표시). – Shizam
@Shizam - GPU 로의 업로드는 꽤 빠르며, GPU에서 정보를 가져 오는'glReadPixels()'호출조차도 10 밀리 초 정도 iPhone 4의 적당한 크기의 이미지에 대해 수행 할 수 있습니다. CPU보다 GPU에서 훨씬 빨라 졌으므로 어딘가에 숨겨진 오버 헤드가 있어야합니다. 아마 Core Image 내의 어딘가에서 (아마도 CGImageRef로 또는 CGImageRef로부터) 포맷 변환이 이루어질 것입니다. Peter가 말했듯이, Time Profiler는 병목 현상이있는 곳을 찾아 낼 수도 있습니다. –