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



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

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

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

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

几乎。 更准确地说(至少在精神上(:

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

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

如果你想发生这种情况,你需要通过删除上面的一些步骤来告诉系统这样做。

(UIKit,CoreAnimation和CoreGraphics之间没有链接可以提供您所期望的"快速路径"。

最简单的方法是制作一个UIImageView,并将其image设置为包装CGImageRefUIImage

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

相关内容

  • 没有找到相关文章

最新更新