在我的 iPad 应用程序中,我正在渲染到屏幕外的位图,然后将位图绘制到屏幕上。(这是因为我想重用现有的位图呈现代码。在iPad 2上,这就像一个魅力,但在带有Retina显示屏的新iPad上,绘制位图真的很慢,即使它的分辨率仍然相同。
为了绘制位图,我们使用常规的Quartz 2D函数:CGImageCreate
使用由CGDataProviderCreateWithData
创建的数据提供程序,32位RGBA格式与kCGImageAlphaNoneSkipLast
。在显示位图的UIView
中,在 drawRect:
中,我们使用CGContextDrawImage
将其绘制到UIGraphicsGetCurrentContext
返回的上下文中。
请注意,我什至没有尝试以双分辨率绘制:现在我对与iPad 2上使用的分辨率相同。看起来 CoreGraphics 在内部将像素加倍,然后将其发送到 GPU,即使我正在制作的CGImage
应该可以直接传递给 GPU。有什么想法吗?
看起来CoreGraphics在内部将像素加倍,然后将其发送到GPU,
几乎。 更准确地说(至少在精神上(:
- UIKit 以设备像素为单位,对视图边界的大小进行
CGBitmapContext
- 它使该上下文成为当前上下文
- 您将
CGImage
拉入该上下文 - 。所以CG必须重新缩放源图像,并触摸所有目标像素
- 完成绘制后,UIKit 会从位图上下文进行
CGImage
- 并将其分配给视图图层的内容。
我正在制作的CGImage应该可以直接传递给GPU。
如果你想发生这种情况,你需要通过删除上面的一些步骤来告诉系统这样做。
(UIKit,CoreAnimation和CoreGraphics之间没有链接可以提供您所期望的"快速路径"。
最简单的方法是制作一个UIImageView
,并将其image
设置为包装CGImageRef
的UIImage
。
或者,将您的view.layer.contents
设置为您的CGImageRef
。(并确保不要覆盖-drawRect:
,不要调用-setNeedsDisplay
,并确保contentMode
不是UIViewContentModeRedraw
。更容易使用UIImageView
。