2012-03-30 160 views
0

我正在製作遊戲元素看起來像是由施工紙製成的遊戲。爲了實現肌理效果在我每次抽籤週期結束融合全屏圖像:改進全屏Core Graphics圖像混合性能?

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // ... draw things ... // 

    CGContextSetBlendMode(context, kCGBlendModeHardLight); 
    CGContextSetAlpha(context, 0.4); 
    CGContextDrawImage(context, [self frame], [paperTexture CGImage]); 
} 

不幸的是,這使得從60幀速率下降到什麼感覺〜10。有沒有更好的方式來做到這一點,而不移動到OpenGL?

+0

您是否必須使用強光混合模式,或者您可以通過在包含紙張紋理的整個屏幕上覆蓋半透明視圖或圖層來獲得足夠近的距離?這將避免昂貴的'CGContextDrawImage()'調用,並且可以讓您不必每幀重繪Quartz內容,但能夠將它緩存在單獨的視圖或圖層中。 – 2012-04-02 00:34:47

+0

我其實剛剛完成將所有圖形代碼轉換爲Core Animation,並且像您所建議的那樣,我使用覆蓋圖層來實現該效果。普通的不透明度看起來不如強光,但它的工作原理。 Heres希望Apple能夠實現CA Layer濾鏡API ... – Hooper 2012-04-02 18:18:48

+0

即使如此,他們也會使用Core Image作爲濾鏡,[在我的基準測試中](http://stackoverflow.com/a/6628208/19679),Core Image現在在iOS上並不是那麼快。我的GPUImage速度要快得多,但它確實需要您的源材料以某種方式進入OpenGL ES紋理。也許像Cocos2d這樣的渲染可以渲染到紋理支持的FBO,並且該紋理可以輸入到GPUImage中進行硬混合合成(紙張圖像只需要上傳一次)。這將是我能想到達到這種確切效果的最快方式。 – 2012-04-02 19:32:44

回答

0

退房GPUImage我聽說有非常好的表現。

+0

不是我在找什麼。這看起來像是在內存中的圖像上運行過濾器。我需要覆蓋到屏幕上,而不是圖像。是的,我可以從當前的CGContext創建一個圖像,然後過濾,然後將其拖回到屏幕上,但是我認爲所有圖像創建,複製和繪製都會取消任何GPU優勢。 – Hooper 2012-03-30 18:44:27