我已经编写了一个应用来测试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几乎没有时间花在任何我能识别的绘图方法上。
我很想知道发生了什么。任何帮助都将非常感激。
答案 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