10

在我的 iPad 应用程序中,我渲染到离屏位图,然后将位图绘制到屏幕上。(这是因为我想重用现有的位图渲染代码。)在 iPad 2 上,这很有魅力,但在配备 Retina 显示屏的新 iPad 上,绘制位图真的很慢,尽管它的分辨率仍然是相同的。

为了绘制位图,我们使用常规的 Quartz 2D 函数:使用由32 位 RGBA 格式CGImageCreate创建的数据提供程序,使用. 在显示位图的 中,我们使用将其绘制到由返回的上下文中。CGDataProviderCreateWithDatakCGImageAlphaNoneSkipLastUIViewdrawRect:CGContextDrawImageUIGraphicsGetCurrentContext

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

4

1 回答 1

15

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

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

  1. UIKitCGBitmapContext以设备像素为单位制作视图边界的大小
  2. 它使该上下文成为当前上下文
  3. 你把你的画CGImage入那个语境
  4. ...因此 CG 必须重新缩放源图像,并触摸所有目标像素
  5. 完成绘图后,UIKitCGImage从位图上下文中生成
  6. 并将其分配给视图层的内容。

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

如果您希望这种情况发生,您需要通过删除上述一些步骤来告诉系统这样做。

(UIKit、CoreAnimation 和 CoreGraphics 之间没有提供您期望的“快速路径”的链接。)

最简单的方法是制作一个UIImageView, 并将其设置imageUIImage包装你的CGImageRef.

或者,将您的设置view.layer.contents为您的CGImageRef. (并确保不要覆盖-drawRect:不要调用,-setNeedsDisplay确保contentMode不是。更容易使用。) UIViewContentModeRedrawUIImageView

于 2012-05-03T03:20:22.987 回答