【问题标题】:Drawing image with CoreGraphics on Retina iPad is slow在 Retina iPad 上使用 CoreGraphics 绘制图像很慢
【发布时间】:2012-05-02 08:22:14
【问题描述】:

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

为了绘制位图,我们使用常规 Quartz 2D 函数:CGImageCreate 和由 CGDataProviderCreateWithData 创建的数据提供程序,32 位 RGBA 格式和 kCGImageAlphaNoneSkipLast。在显示位图的UIView 中,在drawRect: 中,我们使用CGContextDrawImage 将其绘制到UIGraphicsGetCurrentContext 返回的上下文中。

请注意,我什至没有尝试以双倍分辨率绘图:现在我可以使用与 iPad 2 上相同的分辨率。看起来 CoreGraphics 在内部将像素加倍,然后发送到GPU,即使我正在制作的CGImage 应该可以直接传递给GPU。有什么想法吗?

【问题讨论】:

    标签: performance ipad core-graphics retina-display


    【解决方案1】:

    看起来 CoreGraphics 在内部将像素加倍,然后将其发送到 GPU,

    差不多。更准确地说(至少在精神上):

    1. UIKit 将 CGBitmapContext 设置为视图边界的大小,以设备像素为单位
    2. 它使该上下文成为当前上下文
    3. 您将CGImage 绘制到该上下文中
    4. ...所以 CG 必须重新缩放源图像,并触摸所有目标像素
    5. 绘制完成后,UIKit 从位图上下文中生成CGImage
    6. 并将其分配给视图层的内容。

    我正在制作的 CGImage 应该可以直接传递给 GPU。

    如果您希望这种情况发生,您需要通过删除上述一些步骤来告诉系统这样做。

    (UIKit、CoreAnimation 和 CoreGraphics 之间没有提供您期望的“快速路径”的链接。)

    最简单的方法是创建一个UIImageView,并将其image 设置为一个UIImage 包装你的CGImageRef

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

    【讨论】:

    • 感谢您提供的信息,这可能会有很大帮助。视图是动画的,所以它经常重绘。我认为因此使用 view.layer.contents 可能比将新图像分配给 UIImageView 更有效,对吧?
    • 试过了,view.layer.contents 方法效果很好,再次感谢!
    • AFAIK 这两种方法在性能上几乎相等,但一如既往:如果重要,请尝试看看。
    • 如果有人像我一样想知道,你必须像 view.layer.contents = (id) myUIImage.CGImage; 那样将图像引用投射到 id 你还应该在使用 arc view.layer.contents = (__bridge id) myUIImage.CGImage; 详细信息时使用桥接投射在这里找到stackoverflow.com/a/5455139/1721611
    猜你喜欢
    • 2012-04-26
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多