2010-03-27 34 views

回答

1

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

随着UIKit了解更多关于什么/不绘制的内容,您可能会获得非常轻微的性能提升。

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

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

1)创建一个新的XCode项目:

谢谢,山姆


编辑

mystify非常合理的意见之后,我做了以下测试它应用

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)然它在工具 - 对象分配从模拟器的重新开始。

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

但是,仍然有几个问题 -

一)我使用一个UIImageView,以确保我有这样的需要绘制我的观点的全部内容 - UI层可以优化不同的不同UIView的子类。 b)我在模拟器中运行它(我没有iPhone,很方便,我的手机坏了) - 我99%肯定它在设备上没有任何不同,但我也知道模拟器对于内存泄漏并不是100%准确的,因此在设备上测试也是一个好主意。

+0

你为什么不这样做?这是一个150代表赏金;-)(但感谢提示,要尽快尝试) – dontWatchMyProfile

+0

一个非常公平的点;)看看我上面的编辑! – deanWombourne

1

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

编辑:顺便说一句,UIKit足够智能,不会呈现不可见的东西,或者是因为它不在屏幕上或被其他视图遮挡。但是,由于您已经在内存中保存了整个视图,因此这不会有助于提高内存使用率,但只能提高渲染速度。

3

clipsToBounds急剧降低性能。尝试在clipToBounds打开的情况下在滚动视图中放置一堆视图,然后在视图中需要实际剪辑的区域添加一些内容(例如视图具有圆角半径),然后运行并滚动。滚动将非常生涩。

你并没有让处理器的工作变得更容易,通过告诉它渲染得更少,你给它做了更多的工作来决定要画什么和不画什么。这占用了周期。

+1

我刚刚发现这种困难的方式 - 然后做了谷歌搜索“clipsToBounds生涩”,并找到了这个线程。我在滚动视图中看到一堆视图,每个视图都打开了clipsToBounds。这些视图有圆角,我的滚动是生涩。我正在考虑在每个视图中创建一个子视图(使用常规方形角),并使用clipsToBounds对其进行设置,而不是使用圆角。 –

相关问题