我有一个非常大的视图,就像1000 x 1000.所以我做了clipToBounds = YES。这实际上会为视图产生较小的位图吗?
答案 0 :(得分:3)
clipsToBounds会大幅降低性能。尝试在打开clipsToBounds的滚动视图中放置一组视图,然后在视图中添加实际必须剪切的区域(例如,视图具有角半径),运行和滚动。滚动会非常生涩。
你并没有让处理器的工作“更容易”,因为它告诉它要少渲染,你要做更多的工作要做,这决定了要绘制什么和不绘制什么。这会占用周期。
答案 1 :(得分:1)
我不这么认为。 clipsToBounds
指的是子视图,而不是视图本身。 UIView
文档建议将CATiledLayer
用于特别大的视图。 CATiledLayer
应该降低内存占用量,因为它只会加载实际显示给用户的视图部分(有点像Google地图加载地图图块)。
答案 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%准确,因此在设备上进行测试可能是个好主意。