2012-05-02 85 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这两种方法在性能上几乎相同,但一如既往:如果重要,试试看看。 –

相关问题