【问题标题】:CGContextDrawImage very slow on iPhone 4CGContextDrawImage 在 iPhone 4 上非常慢
【发布时间】:2010-10-12 13:59:35
【问题描述】:

我将 CGBitmapContextRef 用于大型可变图像。 比我在 UIView.drawRect 中绘制一个部分。 这在 iPhone 3GS - 17FPS 上运行良好。 但在 iPhone 4 上调用 subj 方法非常慢 - 总 FPS 为 1.5!

profiler 说:在 3GS 上调用 CGSBlendBGRA8888toRGBA8888 需要 23% 的总时间。在 4G 上,相同的代码调用 argb32_sample_RGBA32/argb32_image_mark 大约需要 90%。哇!

位图的色彩空间是 CGColorSpaceCreateDeviceRGB。创建标志是 kCGImageAlphaPremultipliedLast。

如何在 iPhone 4 上获得更好的性能?有什么建议吗?

【问题讨论】:

    标签: iphone bitmap


    【解决方案1】:

    尝试设置:

    CGContextSetInterpolationQuality(myBitmapContext, kCGInterpolationNone);
    

    在您的位图上。 kCGInterpolationLow 是另一种选择。

    另一种可能有帮助的技术是将 CALayer 添加到您的视图中,并将 CALayer 的内容设置为您的位图,而不是在视图的 drawRect 中绘制位图图像。

    【讨论】:

    • 谢谢。我试过你的技术。 1) kCGInterpolationNone - 缩放时对我来说质量不好。 kCGInterpolationLow - 质量好,FPS 好一些(~5-10%)。 2)CALayer.contents不想吃CGBitmapContext,只吃CGImage。但是对于这种情况,我接下来要做: /* 在写入 */ [.layer.contents = nil] 时不能引用上下文图像; [更改上下文的像素]; [.layer.contents = CGBitmapContextCreateImage(pCtx)];并且 3GS 上的代码给了我们 8FPS(17)和 4G 12FPS(1.5)
    • ... 并清除 .layer.contents 并且有时会设置一次闪烁
    • 我重写了使用 OpenGLES 进行绘图和使用本机 UI 控件进行缩放和滚动的代码。我在大小为 256x256 的 N*K 纹理上分割了我的大可变图像。有时会更新其中的一些。现在的 FPS:3G - 27、3GS - 55、4G - 60、iPad - 53
    • @user396550 我有一个非常相似的问题,你的解决方案听起来很有趣——你能更详细地解释你做了什么以及如何做,甚至分享一些代码吗?也许作为这个问题的新答案。谢谢!
    猜你喜欢
    • 2018-06-29
    • 2010-12-17
    • 2015-04-14
    • 2018-08-21
    • 2018-06-14
    • 2013-06-19
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多