我编写了一个应用程序来测试 iOS 上的图像性能。我尝试了 3 种不同的视图,都显示相同的大 PNG。第一个是使用 CGContextDrawImage() 绘制的视图。第二个设置 self.layer.content。第三个是一个普通的 UIImageView。
使用的图像使用 -[UIImage initWithContentsOfData:] 创建并缓存在 viewController 中。每个测试重复分配一个视图,将其添加到视图层次结构中,然后将其删除并释放它。从 loadView 开始到 viewDidAppear 的时间以 fps 的形式给出(实际上是每秒视图绘制)。
以下是运行 5.1 的 iPad 1 使用 912 x 634 未缩放图像的结果:
CGContext: 11 fps
CALayer: 10 fps
UIImageView: 430 fps (!)
我产生幻觉了吗?UIImageView 几乎不可能画得那么快,但我实际上可以看到图像闪烁。我尝试在两个相似的视图之间交换以阻止可能的缓存,但帧速率甚至更高。
我一直认为 UIImageView 只是 -[CALayer setContent] 的包装器。但是,分析 UIImageView 显示几乎没有时间花在我可以识别的任何绘图方法上。
我很想了解发生了什么。非常感激任何的帮助。