gpt4 book ai didi

ios - UIImageView 的显示速度比 CG 或 CALayer 快得多。有人知道为什么吗?

转载 作者:可可西里 更新时间:2023-11-01 03:18:55 27 4
gpt4 key购买 nike

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

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

以下是运行 5.1 的 iPad 1 使用 912 x 634 未缩放图像的结果:

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

我是不是幻觉了? UIImageView 几乎不可能绘制得那么快,但我实际上可以看到图像闪烁。我尝试在两个相似的 View 之间交换以消除可能的缓存,但帧速率甚至更高。

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

我很想了解发生了什么。任何帮助将不胜感激。

最佳答案

这是我的想法。

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

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

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

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

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

关于ios - UIImageView 的显示速度比 CG 或 CALayer 快得多。有人知道为什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10219984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com