在Retina iPad上使用CoreGraphics绘制图像很慢

时间:2012-05-02 08:22:14

标签: performance ipad core-graphics retina-display

在我的iPad应用中,我正在渲染到屏幕外的位图,然后将位图绘制到屏幕上。 (这是因为我想重新使用现有的位图渲染代码。)在iPad 2上,这就像一个魅力,但在带有Retina显示屏的新iPad上,绘制位图非常慢,即使它的分辨率仍然是相同。

为了绘制位图,我们使用常规的Quartz 2D函数:CGImageCreate,其中CGDataProviderCreateWithData创建了一个数据提供程序,带有kCGImageAlphaNoneSkipLast的32位RGBA格式。在UIView显示位图的drawRect:中,我们使用CGContextDrawImage将其绘制到UIGraphicsGetCurrentContext返回的上下文。

请注意,我甚至没有尝试以双倍分辨率绘制:现在我的分辨率与我在iPad 2上使用的分辨率相同。看起来CoreGraphics内部倍增像素,然后发送到GPU,即使我正在制作的CGImage应该可以直接传递给GPU。有什么想法吗?

1 个答案:

答案 0 :(得分:15)

  

看起来CoreGraphics内部将像素加倍,然后将其发送到GPU,

差不多。更准确(至少在精神上):

  1. UIKit以设备像素为视图边界大小CGBitmapContext
  2. 它使该上下文成为当前上下文
  3. 您将CGImage绘制到该上下文
  4. ...因此CG必须重新缩放源图像,并触摸所有目标像素
  5. 完成绘图后,UIKit从位图上下文中生成CGImage
  6. 并将其分配给视图的图层内容。
  7.   

    我正在制作的CGImage应该可以直接传递给GPU。

    如果您希望这种情况发生,您需要通过删除上述一些步骤告诉系统执行此操作。

    (UIKit,CoreAnimation和CoreGraphics之间没有任何链接可以像您期望的那样提供“快速路径”。)

    最简单的方法是制作UIImageView,并将image设置为UIImage包裹CGImageRef

    或者,将view.layer.contents设置为CGImageRef。 (并确保覆盖-drawRect:致电-setNeedsDisplay,并确保contentMode UIViewContentModeRedraw。更容易使用UIImageView。)