Performance 在iPad上使用CoreGraphics绘制图像速度较慢
在我的iPad应用程序中,我正在渲染屏幕外位图,然后将位图绘制到屏幕上。(这是因为我想重复使用现有的位图渲染代码。)在iPad2上,这很有魅力,但在带有视网膜显示器的新iPad上,绘制位图的速度非常慢,即使其分辨率仍然相同 为了绘制位图,我们使用常规的Quartz 2D函数:Performance 在iPad上使用CoreGraphics绘制图像速度较慢,performance,ipad,core-graphics,retina-display,Performance,Ipad,Core Graphics,Retina Display,在我的iPad应用程序中,我正在渲染屏幕外位图,然后将位图绘制到屏幕上。(这是因为我想重复使用现有的位图渲染代码。)在iPad2上,这很有魅力,但在带有视网膜显示器的新iPad上,绘制位图的速度非常慢,即使其分辨率仍然相同 为了绘制位图,我们使用常规的Quartz 2D函数:CGImageCreate和由CGDataProviderCreateWithData创建的数据提供程序,32位RGBA格式和kCGImageAlphaNoneSkipLast。在显示位图的ui视图中,在drawRect:中
CGImageCreate
和由CGDataProviderCreateWithData
创建的数据提供程序,32位RGBA格式和kCGImageAlphaNoneSkipLast
。在显示位图的ui视图中,在drawRect:
中,我们使用CGContextDrawImage
将其绘制到UIGraphicsGetCurrentContext
返回的上下文中
请注意,我甚至没有尝试以双分辨率画图:现在我可以使用与iPad2相同的分辨率。看起来CoreGraphics在内部将像素加倍,然后将其发送到GPU,即使我正在制作的CGImage
可以直接传递到GPU。有什么想法吗
看起来CoreGraphics在内部将像素加倍,然后将其发送到GPU
差不多。更准确地说(至少在精神上):
UIKit生成一个CGBitmapContext
视图边界的大小,以设备像素为单位
它使该上下文成为当前上下文
您可以将CGImage
绘制到该上下文中
。。。因此CG必须重新缩放源图像,并触摸所有目标像素
完成绘制后,UIKit从位图上下文生成一个CGImage
并将其指定给视图的图层内容
我正在制作的CGImage应该可以直接传递到GPU
如果您想让这种情况发生,您需要告诉系统这样做,方法是省去上面的一些步骤
(UIKit、CoreAnimation和CoreGraphics之间没有提供您所期望的“快速路径”的链接。)
最简单的方法是创建一个UIImageView
,并将其图像设置为UIImage
包装您的CGImageRef
或者,将view.layer.contents
设置为CGImageRef
。(并且确保不要覆盖-drawRect:
,不要调用-setNeedsDisplay
,并且确保内容模式
不是UIViewContentModeRedraw
。只需使用UIImageView
就可以了)谢谢您的信息,这可能会有很大帮助。该视图已设置动画,因此它经常重画。因此,我认为使用view.layer.contents可能比将新图像分配给UIImageView更有效,对吗?尝试过它后,view.layer.contents方法非常有效,再次感谢!好吧,这两种方法在性能上几乎相同,但一如既往:如果有关系,试试看。如果有人想知道我是谁,你必须将image ref转换为id,如soview.layer.contents=(id)myUIImage.CGImage代码>在使用arcview.layer.contents=(uu bridge id)myUIImage.CGImage时,还应该使用桥接cast代码>详细信息可在此处找到