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

回答

1

的事情,你需要重新呈現是最好的詞,或者說需要做多個過濾器的東西。

它目前速度較慢,因爲這些項必須從cpu內存複製到gpu內存(在ios上沒有opengl統一內存支持)。

這意味着由於您只做了一個效果,由於雙份複印,它將需要更多時間。

+0

我認爲這是我的問題的要點,我需要弄清楚如何使用'CAEAGLLayers'。 – Shizam