我終於坐下來轉換我們的一些圖形庫來使用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 ms左右完成,以便在iPhone 4上獲得體面大小的圖像。這當然可以在GPU上做得比CPU快得多,所以在那裏必須有一些隱藏的開銷。也許這些格式轉換是在Core Image中的CPU上完成的(可能來自CGImageRef)。正如Peter建議的那樣,Time Profiler可能會列出瓶頸所在。 –