UIImageView显示的速度比CG或CALayer快。谁知道为什么?

时间:2012-04-19 00:21:47

标签: ios uiimageview core-animation core-graphics calayer

我已经编写了一个应用来测试iOS上的图像性能。我尝试了3种不同的视图,都显示了相同的大PNG。第一个是使用CGContextDrawImage()绘制的视图。第二个设置self.layer.content。第三个是简单的UIImageView。

使用的图像是使用 - [UIImage initWithContentsOfData:]创建的,并在viewController中缓存。每个测试重复分配一个视图,将其添加到视图层次结构中,然后将其删除并释放它。计时从loadView的开始到viewDidAppear,并以fps的形式给出(实际上,每秒查看绘图)。

以下是使用912 x 634非标定图像运行5.1的iPad 1的结果:

CGContext:    11 fps
CALayer:      10 fps
UIImageView: 430 fps (!)

我是幻觉吗?看起来UIImageView几乎不可能快速绘制,但我实际上可以看到图像闪烁。我尝试在两个相似的视图之间进行交换以击败可能的缓存,但帧速率甚至更高。

我一直认为UIImageView只是 - [CALayer setContent]的包装器。但是,分析UIImageView几乎没有时间花在任何我能识别的绘图方法上。

我很想知道发生了什么。任何帮助都将非常感激。

3 个答案:

答案 0 :(得分:1)

这是我的想法。

修改UIView层次结构时,通过添加,删除或修改某些视图,还不会执行实际绘图。相反,视图标有'setNeedsDisplay',并在下次runloop可自由绘制时重绘。

事实上,如果您的测试代码看起来像这样(我只能猜测):

for (int i=0; i<10000; i++) {
     UIImageView* imageView = [[UIImageView alloc] initWithFrame:frame];
     [mainView addSubview: imageView];
     [imageView setImage: image];
     [mainView removeSubview: imageView];
}

比runloop被阻止,直到这个for循环完成。视图层次结构仅绘制一次,测量的性能是分配和初始化对象的性能。

另一方面,我认为CGContextDrawImage()可以立即自由绘制。

答案 1 :(得分:1)

使用UIImageView的高FpS是因为这实际上并没有重绘,而是在UIKit感觉就像这样做时,有时候只会标记重绘的内容。

作为说明: 但奇怪的是,CGContext方法比CALayer方法更快。我也在我的项目中尝试过这些方法,使用CALayer是最快的方法(当然除了使用OpenGL ES)。

答案 2 :(得分:0)

UIImageView使用不同的渲染图像的方式,效率更高。您应该看一下WWDC 2011中的这个会话视频,它解释了渲染过程的工作原理:https://developer.apple.com/videos/wwdc/2011/?id=121