2012-05-02 122 views
10

在我的iPad應用程序中,我渲染到離屏位圖,然後將位圖繪製到屏幕上。 (這是因爲我想重新使用現有的位圖渲染代碼。)在iPad 2上,這很像一個魅力,但在帶有Retina顯示屏的新iPad上,繪製位圖非常慢,即使其分辨率仍然是相同。要繪製位圖,我們使用常規的Quartz 2D函數:CGImageCreate與由CGDataProviderCreateWithData創建的數據提供程序,32位RGBA格式和kCGImageAlphaNoneSkipLast。在顯示位圖的UIView中,在drawRect:中,我們使用CGContextDrawImage將其繪製到由UIGraphicsGetCurrentContext返回的上下文中。在Retina iPad上使用CoreGraphics繪製圖像很慢

請注意,我甚至沒有試圖以雙倍分辨率繪製:現在我很好,與我在iPad 2上使用相同的分辨率。它看起來像CoreGraphics內部加倍像素,然後發送即使我製作的CGImage應該可以直接傳遞給GPU。有任何想法嗎?

回答

15

看起來CoreGraphics在內部增加一倍的像素,然後發送該給GPU,

漂亮多了。更準確的說(至少在精神上):

  1. 的UIKit使得CGBitmapContext您的視圖邊界的大小,在設備像素
  2. 這使得這方面當前上下文
  3. 你畫你CGImage到這方面
  4. ...所以CG不得不重新調整源圖像,然後觸摸所有目標像素的
  5. 你完成繪製後,UIKit中從位圖背景使得CGImage
  6. 並將其分配給視圖的圖層內容。

,我正在做應該是罰款直接傳遞到GPU的CGImage。

如果你想這樣的事情發生,你需要告訴系統要做到這一點,通過切出上面的一些步驟。

(還有UIKit中,CoreAnimation,和CoreGraphics中之間沒有聯繫,提供了一個「快速通道」像你這樣的期待。)

最簡單的方法是使一個UIImageView,並設置其imageUIImage包裝你的CGImageRef

或者,將您的view.layer.contents設置爲您的CGImageRef。 (並確保覆蓋-drawRect:呼叫-setNeedsDisplay,並確保contentModeUIViewContentModeRedraw,容易,只需使用UIImageView

+0

感謝您的信息,這可能將有很大的幫助。該視圖是動畫的,因此經常重繪。我認爲這是使用view.layer。內容可能比將新圖像分配給UIImageView更有效,對吧? –

+1

試過了,view.layer.contents方法出色,再次感謝! –

+0

AFAIK這兩種方法在性能上幾乎相同,但一如既往:如果重要,試試看看。 –

相關問題