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

Joh*_*ano 8 core-animation core-graphics calayer uiimageview ios

我已经编写了一个应用来测试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 (!)
Run Code Online (Sandbox Code Playgroud)

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

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

我很想知道发生了什么.非常感激任何的帮助.

luk*_*asz 1

这是我的想法。

当您通过添加、删除或修改某些视图来修改 UIView 层次结构时,尚未执行实际绘制。相反,该视图被标记为“setNeedsDisplay”,并在下次运行循环可以自由绘制时重新绘制。

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

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

在 for 循环完成之前,runloop 会被阻塞。视图层次结构仅绘制一次,测量的性能是分配和初始化对象的性能。

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