clipsToBounds = YES会减少我的内存占用吗?

时间:2010-03-27 21:31:03

标签: iphone

我有一个非常大的视图,就像1000 x 1000.所以我做了clipToBounds = YES。这实际上会为视图产生较小的位图吗?

3 个答案:

答案 0 :(得分:3)

clipsToBounds会大幅降低性能。尝试在打开clipsToBounds的滚动视图中放置一组视图,然后在视图中添加实际必须剪切的区域(例如,视图具有角半径),运行和滚动。滚动会非常生涩。

你并没有让处理器的工作“更容易”,因为它告诉它要少渲染,你要做更多的工作要做,这决定了要绘制什么和不绘制什么。这会占用周期。

答案 1 :(得分:1)

我不这么认为。 clipsToBounds指的是子视图,而不是视图本身。 UIView文档建议将CATiledLayer用于特别大的视图。 CATiledLayer应该降低内存占用量,因为它只会加载实际显示给用户的视图部分(有点像Google地图加载地图图块)。

编辑:顺便说一句,UIKit非常聪明,不会渲染不可见的内容,因为它不在屏幕之外或被其他视图遮挡。但是,由于你已经将整个视图保存在内存中,这对内存使用有所帮助,但仅限于渲染速度。

答案 2 :(得分:1)

我想可能不是 - 你仍然需要为视图分配内存,而不是显示它。

随着UIKit更多地了解什么/什么不吸引,你可能会获得非常轻微的性能提升。

但是,你可以自己回答这个问题!制作一个可以生成1000个1000x1000视图并将其放在屏幕上的项目。然后查看它在探查器中的内存使用情况。然后在clipToBounds设置为YES的情况下执行相同操作并查看它已更改!

我预测它不会,但我对结果感兴趣 - 如果你这样做,请在这里张贴!

谢谢,Sam


修改

mystify的非常合理的评论之后,我通过以下方式对其进行了测试:

1)创建了一个新的XCode项目 - Window应用程序

2)使用以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch
    [window setClipsToBounds:YES];
    [window makeKeyAndVisible];

    // Make some views
    for (int n = 0; n < 100000; ++n) {
        UIImageView *view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.jpg"]];
        [view setFrame:CGRectMake(0, 0, 1000, 1000)];
        [window addSubview:view];
        [view release];
    }

    return YES;
}

3)建造它

4)在仪器中进行操作 - 从模拟器的新开始进行对象分配。

正如预测的那样,没有变化 - 窗口上clipsToBounds设置为YES或NO,大约需要16MB。

然而,仍有一些问题 -

a)我使用UIImageView来确保我的内容需要为整个视图绘制 - UI层可能会针对UIView的不同子类进行不同的优化。

b)我在模拟器中运行它(我没有iPhone,我的手机坏了) - 我99%肯定它在设备上不会有任何不同但我也知道模拟器不是内存泄漏100%准确,因此在设备上进行测试可能是个好主意。