CGContextDrawImage 在 iPhone 4 上非常慢

Posted

技术标签:

【中文标题】CGContextDrawImage 在 iPhone 4 上非常慢【英文标题】:CGContextDrawImage very slow on 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 上获得更好的性能?有什么建议吗?

【问题讨论】:

【参考方案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 我有一个非常相似的问题,你的解决方案听起来很有趣——你能更详细地解释你做了什么以及如何做,甚至分享一些代码吗?也许作为这个问题的新答案。谢谢!

以上是关于CGContextDrawImage 在 iPhone 4 上非常慢的主要内容,如果未能解决你的问题,请参考以下文章

CGContextDrawImage 在 iPhone 4 上非常慢

巨大的内存峰值 - CGContextDrawImage

CGContextDrawImage 画大图很模糊

Swift 3 和 CGContextDrawImage

-[UIImage drawInRect:] / CGContextDrawImage() 不释放内存?

CGContextDrawImage 崩溃