在我的iPad应用程序中,我渲染到屏幕外的位图,然后将位图绘制到屏幕上。 (这是因为我想重新使用现有的位图渲染代码。)在iPad 2上,它的工作原理很吸引人,但是在带有Retina显示屏的新型iPad上,即使位图的分辨率仍然很高,绘制位图的速度仍然很慢。相同的。
为了绘制位图,我们使用常规的Quartz 2D函数:CGImageCreate
带有由CGDataProviderCreateWithData
创建的数据提供程序,kCGImageAlphaNoneSkipLast
是32位RGBA格式。在显示位图的UIView
中,在drawRect:
中,我们使用CGContextDrawImage
将其绘制到UIGraphicsGetCurrentContext
返回的上下文中。
请注意,我什至没有尝试以双分辨率进行绘制:目前,我可以使用与iPad 2上相同的分辨率。看起来好像CoreGraphics在内部将像素加倍,然后将其发送到GPU ,即使我制作的CGImage
应该可以直接传递给GPU。有任何想法吗?
最佳答案
It looks like CoreGraphics is internally doubling the pixels, and then sending that to the GPU,
差不多了更准确地说(至少在精神上):
CGBitmapContext
,其大小为 View 边界的大小CGImage
绘制到该上下文中CGImage
。the CGImage that I'm making should be fine for passing to the GPU directly.
如果您希望这种情况发生,则需要通过减少上述某些步骤来告诉系统做到这一点。
(UIKit,CoreAnimation和CoreGraphics之间没有提供您期望的“快速路径”的链接。)
最简单的方法是制作一个
UIImageView
,并将其image
设置为包裹UIImage
的CGImageRef
。或者,将
view.layer.contents
设置为CGImageRef
。 (并确保不要覆盖-drawRect:
,不要调用-setNeedsDisplay
,并确保contentMode
不是UIViewContentModeRedraw
。更容易使用UIImageView
。)
关于performance - 在Retina iPad上使用CoreGraphics绘制图像的速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10410106/