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

Fre*_*man 10 performance core-graphics ipad retina-display

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

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

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

Kur*_*vis 15

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

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

  1. UIKit CGBitmapContext以设备像素为单位显示视图边界的大小
  2. 它使该上下文成为当前的上下文
  3. 你将自己绘制CGImage到上下文中
  4. ...所以CG必须重新缩放源图像,并触摸所有目标像素
  5. 完成绘图后,UIKit会CGImage从位图上下文中创建一个
  6. 并将其分配给视图的图层内容.

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

如果您希望这样做,您需要通过删除上面的一些步骤告诉系统这样做.

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

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

或者,设置你view.layer.contentsCGImageRef.(并确保覆盖-drawRect:,打电话-setNeedsDisplay,并确认contentMode不是 UIViewContentModeRedraw.更容易只需使用UIImageView.)

  • 如果有人想要像我一样,你必须将图像ref转换为**id**,就像`view.layer.contents =(id)myUIImage.CGImage;`你也应该在使用arc`视图时使用桥接强制转换. layer.contents =(__ bridge id)myUIImage.CGImage;`详细信息可在此处找到http://stackoverflow.com/a/5455139/1721611 (2认同)