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

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

要绘制位图,我们使用常规Quartz 2D函数:CGImageCreate与由CGDataProviderCreateWithData创建的数据提供者,32位RGBA格式与kCGImageAlphaNoneSkipLast.在显示位图的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,

很多更精确(精神至少):

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

the CGImage that I’m making should be fine for passing to the GPU directly.

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

(UIKit,CoreAnimation和CoreGraphics之间没有链接,它提供了一个像您所期待的“快速路径”).

最简单的方法是制作UIImageView,并将其图像设置为包装CGImageRef的UIImage.

或者,将您的view.layer.contents设置为CGImageRef. (并且确保不覆盖-drawRect :,不调用-setNeedsDisplay,并确保contentMode不是UIViewContentModeRedraw.更容易使用UIImageView.)

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...