在我的iPad应用中,我正在渲染到屏幕外的位图,然后将位图绘制到屏幕上。 (这是因为我想重新使用现有的位图渲染代码。)在iPad 2上,这就像一个魅力,但在带有Retina显示屏的新iPad上,绘制位图非常慢,即使它的分辨率仍然是相同。
为了绘制位图,我们使用常规的Quartz 2D函数:CGImageCreate
,其中CGDataProviderCreateWithData
创建了一个数据提供程序,带有kCGImageAlphaNoneSkipLast
的32位RGBA格式。在UIView
显示位图的drawRect:
中,我们使用CGContextDrawImage
将其绘制到UIGraphicsGetCurrentContext
返回的上下文。
请注意,我甚至没有尝试以双倍分辨率绘制:现在我的分辨率与我在iPad 2上使用的分辨率相同。看起来CoreGraphics内部倍增像素,然后发送到GPU,即使我正在制作的CGImage
应该可以直接传递给GPU。有什么想法吗?
答案 0 :(得分:15)
看起来CoreGraphics内部将像素加倍,然后将其发送到GPU,
差不多。更准确(至少在精神上):
CGBitmapContext
CGImage
绘制到该上下文CGImage
我正在制作的CGImage应该可以直接传递给GPU。
如果您希望这种情况发生,您需要通过删除上述一些步骤告诉系统执行此操作。
(UIKit,CoreAnimation和CoreGraphics之间没有任何链接可以像您期望的那样提供“快速路径”。)
最简单的方法是制作UIImageView
,并将image
设置为UIImage
包裹CGImageRef
。
或者,将view.layer.contents
设置为CGImageRef
。 (并确保不覆盖-drawRect:
,不致电-setNeedsDisplay
,并确保contentMode
不 UIViewContentModeRedraw
。更容易使用UIImageView
。)